Realm点符号过滤关联数据时返回结果不符合预期的问题
解决方案:Realm关联查询后过滤关联列表
你遇到的问题是Realm查询的预期与实际行为不符——equalTo("invoices.deliveryStatus", 0)的作用是筛选出至少包含一个deliveryStatus=0的Invoice的Customer对象,但并不会自动裁剪Customer关联的RealmList<Invoice>,返回的Customer仍然是数据库中的完整对象,包含所有关联的Invoice记录。
要实现“获取仅包含deliveryStatus=0的Invoice的Customer视图”,可以按以下方式处理:
方法1:查询Customer后过滤关联列表
在异步查询完成后,对每个Customer的关联Invoice单独做过滤:
realm.where(Customer.class) .equalTo("invoices.deliveryStatus", 0) .findAllAsync() .addChangeListener(customers -> { // 遍历符合条件的Customer,过滤其Invoice列表 for (Customer customer : customers) { // 获取当前Customer下仅deliveryStatus=0的Invoice RealmResults<Invoice> filteredInvoices = customer.getInvoices() .where() .equalTo("deliveryStatus", 0) .findAll(); // 使用filteredInvoices进行业务逻辑处理,而非原始的customer.getInvoices() } });
方法2:在Customer类中封装过滤逻辑
为了简化调用,可以在Customer实体类中添加一个方法,直接返回过滤后的Invoice列表:
public class Customer extends RealmObject { private RealmList<Invoice> invoices; // 其他属性和方法... public RealmResults<Invoice> getValidInvoices() { return invoices.where().equalTo("deliveryStatus", 0).findAll(); } }
之后在业务代码中直接调用customer.getValidInvoices()即可获取符合条件的Invoice集合。
补充说明
Realm的关联字段查询逻辑是:通过子对象的条件筛选父对象,但不会修改父对象的关联集合——因为Realm对象是与数据库实时绑定的,默认会保留其完整的关联数据。如果需要仅展示符合条件的子对象,必须手动对关联列表执行二次过滤。
内容的提问来源于stack exchange,提问作者Raymond Herring
相关产品推荐
相关产品推荐

