2016-01-13 104 views
1

假設我在我的android應用程序A和B中有2個領域文件.A是加密的,B不是。我在UI線程上查詢領域A,並用一堆字符串屬性獲取領域對象。現在基於這些屬性,我需要使用executeTransaction來更新領域B中的對象,以避免在UI線程中執行此操作。 execute方法爲我提供了一個領域B實例的引用,但我也需要打開領域A,因爲我無法與該線程共享前一個對象。由於領域A是加密的,我認爲在事務中打開和關閉它可能會有點慢。在事務中製作領域對象的只讀副本並使用它會不會更快?這將是這樣的:如何創建只讀領域對象?

RealmObject var1 = realmA.where(SensibleData.class).findFirst(); 
final ReadOnlyObject myReadOnlyObject = copyRealmObject(var1); 
realmB.executeTransaction(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
    //use myReadOnlyObject to decide how to update RealmObjects 
    } 
});   

這是一個很好的解決我的問題?如何實現copyRealmObject以避免存在內存問題?更具體地說,複製字符串的最佳方法是什麼?也許像

copiedAttribute = new String(realmObject.getSomeStringAttribute()); 

回答

0

首先,在Realm.executeTransaction(Realm.Transaction transaction)你稱爲是同步的版本。它將運行在調用者的線程中。您需要撥打executeTransaction(Realm.Transaction transaction, Realm.Transaction.Callback callback)作爲異步版本。見doc of Realm.executeTransaction

對於你的情況,你可以:

  1. 只要打開事務中的加密領域,我不希望它是緩慢的:)但它會添加幾行代碼用於打開/關閉/查詢對象。使用Realm.copyFromRealm。它會將RealmObject從Realm中分離出來,使其可以獨立運行,並且可以通過線程傳遞。儘管它不是隻讀的,但對於您的用戶案例來說,這將非常方便。見doc or Realm.copyFromRealm

----對於複製String問題

我想你永遠不需要複製String,因爲字符串是不可改變的。你應該只使用getters返回的字符串。

相關問題