2016-05-11 2 views
0

В моем приложении у меня есть метод, который принимает ArrayList идентификаторов и возвращает RealmList машин, принадлежащих этим идентификаторам.Создание управляемого RealmList за пределами RealmObject

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() функция просто находит правильную машину для определенного идентификатора.

Я хочу, чтобы фильтровать этот вывод еще немного, однако, когда я пытаюсь получить RealmQuery делая .where(), я получаю исключение, сообщающее мне, что я должен поставить этот 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?
  • Если это возможно, то это проблема, что эта функция вызывается довольно часто
  • Есть ли другой (предпочтительный) способ достичь этого (Список идентификаторов> RealmResults/RealmQuery)

ответ

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

Управляемый означает, что оно сохраняется в царстве.

Если это возможно, то это проблема, что эта функция вызывается довольно часто

Зависит, если вам не нужно упорствовать их снова, увидеть ответ 3.

есть ли другой (предпочтительный) способ достичь этого (Список идентификаторов> 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(); 
+0

Поскольку объекты 'Machine' уже сохранены, и нет необходимости в постоянном использовании этого« RealmList », рекомендуется использовать RealmResults? В более общем смысле: лучше ли использовать RealmResults при передаче недопоставленного подмножества любого набора объектов? – Marcel50506

+1

Да, вам может понадобиться 'RealmQuery.or()', как показано в примере. Кроме того, это не идеальный способ для вашего случая использования, у нас был запрос функции для этого https://github.com/realm/realm-java/issues/841 – beeender

Смежные вопросы