2016-05-15 5 views
1

Я пытаюсь выяснить, что является лучшим способом открыть/закрыть экземпляры Realm. Мы используем Realm в 3-х местах - приложения, действия и рабочий поток. Однако было бы неплохо обращаться к данным из Realm из любого места. Таким образом, мы завернули все наши запросы/записи в Realm в слое данных. Это нормально (с точки зрения производительности) делать следующие для каждого запроса (и аналогичные при каждой записи)?Можно ли закрыть экземпляр Realm после каждого запроса/записи?

try (Realm realm = getRealm()) { 
    return realm.copyFromRealm(realm.where(Task.class).isNull("name") 
    .findAllSorted("createdAt", Sort.DESCENDING)); 
} 

Как вы делаете что-то подобное в транзакции async? Есть ли лучшие подходы? (Мы используем RxJava).

Спасибо!

EDIT: После быстрой реакции от @ Христианско-Мельхиор мы будем использовать его как это:

try (Realm realm = getRealm()) { 
    return realm.copyFromRealm(realm.where(Task.class).isNull("name") 
    .findAllSortedAsync("createdAt", Sort.DESCENDING)); 
} 

EDIT2: На самом деле мы остановились на этом:

Realm realm = getRealm(); 
return realm.where(Task.class).isNull("name") 
    .findAllSortedAsync("createdAt", Sort.DESCENDING) 
    .asObservable() 
    .filter(RealmResults::isLoaded) 
    .first() 
    .map(realmObjects -> { 
     if (realmObjects.isEmpty()) { 
      realm.close(); 
      return null; 
     } 
     List<Task> res = realm.copyFromRealm(realmObjects); 
     realm.close(); 
     return res; 
    }); 

Поскольку мы хотим наш onComplete, который будет вызываться после каждого запроса.

ответ

1

Использование copyFromRealm даст вам копию всех данных в памяти, поэтому пока вы не загружаете огромные списки, она должна работать нормально. Тем не менее, вы будете использовать больше памяти, и есть небольшие накладные расходы при открытии и закрытии Realms все время.

Одна идеи для управления жизненного цикла Realm можно увидеть здесь: https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances

Также обратите внимание на вас во многих случаях можно использовать нашу асинхронную API, если вы беспокоитесь о загрузке данных о потоке пользовательского интерфейса: https://realm.io/docs/java/latest/#asynchronous-queries

+0

Спасибо ! Мы будем использовать методы * Async (забыл упомянуть об этом в примере). Почему Realm делает такие жесткие объекты обновления (вам нужно быть в транзакции), что делает абстрагирование от реализации Realm довольно жестким? Есть ли шанс удалить необходимость в 'close()' вообще? – curiousily

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