Realm on Android - How to select multiple objects by list of ids (@PrimaryKey)?

前端 未结 5 1270
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-02-18 21:25

I\'m building an Android app with the Realm database.

I have a RealmObject subclass called Article which has an id field (it\'s an

相关标签:
5条回答
  • 2021-02-18 21:53

    This is the way Realm does it since 1.2.0:

    public RealmQuery<E> in(String fieldName, String[] values) {
        if (values == null || values.length == 0) {
            throw new IllegalArgumentException(EMPTY_VALUES);
        }
        beginGroup().equalTo(fieldName, values[0]);
        for (int i = 1; i < values.length; i++) {
            or().equalTo(fieldName, values[i]);
        }
        return endGroup();
    }
    

    Previously this is how I did it

    0 讨论(0)
  • 2021-02-18 21:54

    I just came across this post and I thought I could throw in my 2 cents on this. As much as I appreciate Christian Melchior and his answers I think in this case his answer is not working (at least in the current version).

    I prefer to do it like this - I personally think it's more readable than Albert Vila's answer:

    List<String> listOfIds = [..];
    RealmQuery<SomeClass> query = realm.where(SomeClass.class);
    
    boolean first = true;
    for (String id : listOfIds) {
        if (!first) {
            query.or();
        } else {
            first = false;
        }
        query.equalTo("id", id);
    }
    RealmResults<SomeClass> results = query.findAll();
    
    0 讨论(0)
  • 2021-02-18 21:55

    Update:

    Realm 1.2.0 has added RealmQuery.in() for a comparison against multiple values. The documentation details all the available overloads. This one is the method we can use if our ids are Integers:

    public RealmQuery<E> in(String fieldName, Integer[] values)
    

    Original answer:

    The answer from @ChristianMelchior returns all articles if the list of ids is empty. I want it to return an empty RealmResults<Article>. That's what I've ended up doing;

    Set<Integer> articleIds = this.getArticleIds();
    RealmQuery<Article> query = realm.where(Article.class);
    if (articleIds.size() == 0) {
        // We want to return an empty list if the list of ids is empty. 
        // Just use alwaysFalse
        query = query.alwaysFalse();
    } else {
        int i = 0;
        for (int id : articleIds) {
            // The or() operator requires left hand and right hand elements. 
            // If articleIds had only one element then it would crash with
            // "Missing right-hand side of OR"
            if (i++ > 0) {
                query = query.or();
            }
            query = query.equalTo("id", id);
        }
    }
    return query.findAll();
    
    0 讨论(0)
  • 2021-02-18 22:07

    Now realm v 1.2.0 support RealmQuery.in() for a comparison against multiple values.

    0 讨论(0)
  • 2021-02-18 22:19

    The Realm Java API's doesn't support this yet unfortunately. You can follow the feature request here https://github.com/realm/realm-java/issues/841

    The current work-around would be to build up the query yourself in a for-loop:

    RealmResults<Article> articles = realm.allObjects(Article.class);
    RealmQuery q = articles.where();
    for (int id : ids) {
        q = q.equalTo("id", id);
    }
    RealmResults<Article> filteredArticles = q.findAll();
    
    0 讨论(0)
提交回复
热议问题