2016-05-15 57 views
1

我想弄清楚什麼是打開/關閉Realm實例的最佳方法。我們在3個地方使用Realm - App,Activities和Worker thread。但是,從任何地方訪問Realm的數據可能都很酷。因此,我們將所有的Realm查詢/寫入包裝在數據層中。對於每個查詢(以及每次寫入時的類似操作),是否可以(從性能角度來看)執行以下操作?每次查詢/寫入後關閉Realm實例是否正常?

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

如何在異步事務中做類似的事情?有更好的方法嗎? (我們正在使用RxJava)。

謝謝!

編輯:後從@基督教梅爾基奧爾快速反應,我們會使用這樣的:

​​

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將爲您提供所有數據的內存中副本,只要您不加載大型列表,它應該可以正常工作。儘管如此,你將會使用更多的內存,並且在打開和關閉領域時總是會有一些額外的開銷。

控制域生命週期中的一個想法可以在這裏看到:https://realm.io/docs/java/latest/#controlling-the-lifecycle-of-realm-instances

還要注意你在很多情況下,如果你關心的UI線程上加載的數據可以使用我們的異步API:https://realm.io/docs/java/latest/#asynchronous-queries

+0

謝謝!我們將使用*異步方法(在示例中忘記提及)。爲什麼Realm如此難以更新對象(你需要在事務中),這使得Realm的實現變得非常困難?任何可能完全不需要close()的機會? – curiousily

相關問題