【问题标题】:How to query two fields in same Realm query?如何在同一个 Realm 查询中查询两个字段?
【发布时间】:2019-01-08 13:18:05
【问题描述】:

我需要根据名字和姓氏从 Realm Db 中查找客户。目前,我有一个这样的查询:

RealmResults<CustomerModel> results = realm
            .where(CustomerModel.class)
            .or()
            .contains("firstname", input, Case.INSENSITIVE)
            .or()
            .contains("lastname", input, Case.INSENSITIVE)
            .or()
            .contains("addresses.street", input, Case.INSENSITIVE)
            .or()
            .contains("addresses.city", input, Case.INSENSITIVE)
            .or()
            .contains("addresses.postcode", input, Case.INSENSITIVE)
            .findAllSorted("customerLocalId", Sort.DESCENDING);

这不能正常工作,因为我的名字和姓氏之间有 OR。

所以,如果我想查找名为 John Doe 的用户,它不会找到它,但如果我只输入 John,它会找到它。

我该如何解决这个问题?

【问题讨论】:

    标签: android realm realm-mobile-platform


    【解决方案1】:

    为什么不跨空白分割?

    String filter = input.trim().replaceAll("\\s+", " ");
    String[] tokens = filter.split(" ");
    RealmQuery<CustomerModel> query = realm.where(CustomerModel.class);
    
    for(int i = 0, size = tokens.length; i < size; i++) {
        String token = tokens[i];
        if(i != 0) {
            query.or();
        }
        query.contains("firstname", token, Case.INSENSITIVE)
            .or()
            .contains("lastname", token, Case.INSENSITIVE)
            .or()
            .contains("addresses.street", token, Case.INSENSITIVE)
            .or()
            .contains("addresses.city", token, Case.INSENSITIVE)
            .or()
            .contains("addresses.postcode", token, Case.INSENSITIVE)        
    }
    
    RealmResults<CustomerModel> results = query
            .findAllSorted("customerLocalId", Sort.DESCENDING);
    

    【讨论】:

    • 好像不行。我刚试过,结果是一样的。
    • 我试过不带名字和姓氏,或者在名字和姓氏之间,但这根本不起作用。
    • 嗯,也许我搞砸了replaceAll。我最初在答案中有" +",但用\\s+ 替换它,我可能不应该有?你能检查一下吗
    • 我都试过了,但结果是一样的。 Tokens 数组有 2 个项目,“John”和“Doe”,但似乎无法从 DB 中找到以 John 为名且 Doe 为姓氏的项目。所以,我猜查询逻辑有问题。
    • 我已经编辑了我的问题,请有空的时候看看。你有更好的主意吗?
    【解决方案2】:

    您需要使用群组:https://realm.io/docs/java/latest/#logical-operators

    RealmResults<CustomerModel> results = realm
            .where(CustomerModel.class)
            .beginGroup()
            .contains("firstname", input, Case.INSENSITIVE)
            .contains("lastname", input, Case.INSENSITIVE)
            .endGroup()
            .or()
            .contains("addresses.street", input, Case.INSENSITIVE)
            .or()
            .contains("addresses.city", input, Case.INSENSITIVE)
            .or()
            .contains("addresses.postcode", input, Case.INSENSITIVE)
            .findAllSorted("customerLocalId", Sort.DESCENDING);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 2020-11-21
      • 1970-01-01
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多