Android领域查询关系

时间:2016-03-17 19:13:57

标签: android realm

我有一个名为TodoList的Realm对象,它具有像这样的RealmList属性。

   @PrimaryKey
    private int id;
    private String title;    
    private RealmList<Task> tasks;

我在这里是Task Realm对象

   @PrimaryKey
    private int id;
    private String title; 
    private boolean completed;
    private TodoList todoList;

我的问题是什么是编写Realm查询的最佳方法,该查询返回属于特定TodoList的任务列表。这是我的方法。

public RealmResults<Task> getTodoListTasks(int todoListId) {
        RealmResults<Task> tasks = mRealm.where(Task.class)
                .equalTo("todoList.id", todoListId).findAll();
        return tasks;
}

这种方法要求我查询Task表,查找与给定id匹配的所有TodoList外键。我正在跳这样的事情:

 public RealmResults<Task> getTodoListTasks2(TodoList list) {
        TodoList todoList =  mRealm.where(TodoList.class).equalTo("id", list.getId()).findFirst();
        RealmResults<Task> tasks = todoList.getTasks();
        return tasks;

    }

然而,这不会构建,因为我无法将RealmList转换为RealmResult。

2 个答案:

答案 0 :(得分:4)

使用反向链接查询会更容易,但不幸的是它尚未实现(2016年3月18日),请参阅http://github.com/realm/realm-java/issues/607

这两种方法都很好。您实际上可以RealmListRealmResults转换为realmList.where().findAll()

最近将添加另一个更好的抽象对象RealmCollection以更好地支持此用例,请参阅http://github.com/realm/realm-java/pull/2345

答案 1 :(得分:3)

您的问题是,当您确实想要查询TodoList时,您正在基于Task进行查询。

这个问题的简单解决方案是让父项的id也在子项中。

public class Task extends RealmObject {
    @PrimaryKey
    private int id;
    private String title; 
    private boolean completed;
    private TodoList todoList;        
    private int todoListId;
    ...
}

然后你可以做

public RealmResults<Task> getTodoListTasks2(TodoList list) {
    return mRealm.where(Task.class).equalTo("todoListId", list.getId()).findAll();
}