【问题标题】:Creating managed RealmList outside RealmObject在 RealmObject 之外创建托管 RealmList
【发布时间】:2016-05-11 12:16:52
【问题描述】:

在我的应用程序中,我有一个方法可以接受 ID 的 ArrayList 并返回属于这些 ID 的机器的 RealmList

public RealmList<Machine> getMachinesById(ArrayList<Long> machineIds) {
    RealmList<Machine> machines = new RealmList<Machine>();
    for (int i = 0; i < machineIds.size(); i++){
        Machine m = getMachineById(machineIds.get(i));
        if (m != null) {
            machines.add(m);
        }
    }
    return machines;
}

getMachineById() 函数只是为特定 id 找到正确的机器。

我想进一步过滤此输出,但是,当我尝试通过执行.where() 获取RealmQuery 时,我收到一个异常,告诉我应该将这个RealmList 置于“托管模式”。

Caused by: io.realm.exceptions.RealmException: This method is only available in managed mode
                                                 at io.realm.RealmList.where(RealmList.java:425)

我知道我收到此错误是因为此列表是独立的,不受 Realm 管理。

补充一点可能很重要,这个函数会被调用很多次,因为每次我的应用程序中的某些列表刷新时都会触发它。这意味着(如果可能的话)每次我创建一个新的托管 RealmList。

我的问题:

  • 有没有办法让这个 RealmList 由 Realm 管理?
  • 如果可能的话,是否经常调用此函数有问题
  • 是否有任何其他(首选)方式来实现这一点(ID 列表 > RealmResults/RealmQuery)

【问题讨论】:

    标签: java realm realm-list


    【解决方案1】:

    有没有办法让这个 RealmList 由 Realm 管理?

    是的。有。但是拥有RealmList 的意义在于它应该是RealmObjects 的一个字段。例如:

    public class Factory {
        RealmList<Machine> machineList;
        // setter & getters
    }
    
    Factory factory = new Factory();
    RealmList<Machine> machineList = new RealmList<>();
    // Add something to the list
    factory.setMachines(machineList);
    realm.beginTransaction();
    Factory managedFactory = realm.copyToRealmOrUpdate(factory);
    realm.commitTransaction();
    

    Managed 表示它已被持久化 Realm。

    如果可能的话,这个函数经常被调用是否有问题

    视情况而定,如果您不需要再次持久化它们,请参阅答案 3。

    是否有任何其他(首选)方式来实现这一点(ID 列表 > RealmResults/RealmQuery)

    在您的情况下,也许您可​​以改用ReaulResults?例如:

    RealmQuery<Machine> query = realm.where(Machine.class);
    for (int i = 0; i < machineIds.size(); i++){
        if (i != 0) query = query.or();
        query = query.equalTo("id", machineIds.get(i));
    }
    RealmResults<Machine> machines = query.findAll();
    

    【讨论】:

    • 既然Machine对象已经被持久化了,这个RealmList就不用自己持久化了,是不是最好用RealmResults?在更一般的意义上:在传达任何对象集的非持久子集时使用 RealmResults 是一种更好的模式?
    • 是的,所以您可能需要RealmQuery.or(),如我在示例中所示。此外,这不是您的用例的理想方式,我们有一个功能请求 github.com/realm/realm-java/issues/841
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多