Search code examples
androidrealm

Realm query with child arrays


Here's the Object I'm working with:

public class NavigationMenuModule extends RealmObject implements Parcelable {

    @PrimaryKey
    public String sectionKey;

    public RealmList<ItemModule> modules;
    public RealmList<Article> spotlightSponsored;
    public RealmList<Article> items;
}

The child Article Object:

public class Article extends RealmObject {
        @PrimaryKey
        public String contentId;
        public String leadImageURL;
        public String summary;
        public String headline;
    }

How would I structure this realm call:

  1. get NavigationMenuModule item by sectionKey
  2. get spotlightSponsored within that NavigationMenuModule that matches the article's contentId

The method below works but I feel like there's probably a "neater" way:

public static Article getArticle(String sectionKey, String articleId) {
    Realm realm = Realm.getDefaultInstance();

    NavigationMenuModule navigationMenuModule = realm.where(NavigationMenuModule.class).equalTo("sectionKey", sectionKey).findFirst();
    if (navigationMenuModule != null && !navigationMenuModule.spotlightSponsored.isEmpty()) {
        for (Article article : navigationMenuModule.spotlightSponsored) {
            if (article.getContentId().equals(articleId)) {
                Article ret = realm.copyFromRealm(article);
                realm.close();
                return ret;
            }
        }
    }
    realm.close();
    return null;
}

Solution

  • Theoretically this should work with Realm 3.5.0

    public class NavigationMenuModule extends RealmObject implements Parcelable {   
        @PrimaryKey
        public String sectionKey;
    
        public RealmList<ItemModule> modules;
        public RealmList<Article> spotlightSponsored;
        public RealmList<Article> items;
    }
    
    public class Article extends RealmObject {
        @PrimaryKey
        public String contentId;
        public String leadImageURL;
        public String summary;
        public String headline;
    
        @LinkingObjects("spotlightSponsored")
        public final RealmResults<NavigationMenuModule> spotlightSponsoredOf = null;
    
        @LinkingObjects("items")
        public final RealmResults<NavigationMenuModule> itemsOf = null;
    }
    
    public static Article getArticle(Realm realm, String sectionKey, String articleId) {    
        return realm.where(Article.class)
                    .equalTo("contentId", articleId)
                    .equalTo("spotlightSponsoredOf.sectionKey", sectionKey)
                    .findFirst();
    }