我有一个名为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。
答案 0 :(得分:4)
使用反向链接查询会更容易,但不幸的是它尚未实现(2016年3月18日),请参阅http://github.com/realm/realm-java/issues/607。
这两种方法都很好。您实际上可以RealmList
将RealmResults
转换为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();
}