Psest328 Psest328 - 5 months ago 19
Android Question

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 sectionKey;
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 sectionKey



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;
}

Answer Source

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 sectionKey;
    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();
}