【问题标题】:Android Realm Query RelationshipAndroid Realm 查询关系
【发布时间】:2016-03-18 17:44:26
【问题描述】:

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

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

我这里是任务领域对象

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

这种方法要求我查询任务表以查找与给定 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。

【问题讨论】:

  • 第二种方法是我的做法——为什么需要RealmResults?为什么不能直接返回RealmList
  • 感谢 Adam,我需要 RealmResults 用于 RealmRecyclerViewAdapter
  • 使用反向链接会容易得多,但不幸的是它还没有实现,请参阅github.com/realm/realm-java/issues/607。这两种方法都很好。您实际上可以通过 realmList.where().findAll()RealmList 转换为 RealmResults 。最近将添加另一个更好的抽象对象以更好地支持此用例,请参阅github.com/realm/realm-java/pull/2345
  • 哇,感谢@beeender 的更新。如果您想将您的评论推广到一个答案,我很乐意接受它,RealmList 到 RealmResult 的转换正是我想要的。

标签: android realm


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您的问题是,当您实际想要查询Tasks 时,您正在根据TodoList 进行查询。

    解决这个问题的简单方法是让父级的 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();
    }
    

    【讨论】:

    • 谢谢@EpicPandaForce。我确实尝试过您的方法,我希望能够返回 TodoList 中的任务计数,例如 todoLists.getTasks().size()。
    • 如果你的任务只属于一个TodoList,那么在我的情况下getTodoListTasks2.size()给你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    相关资源
    最近更新 更多