2014-10-28 29 views
7

在我的應用程序中,我通常有一個加載器,它從sqlite加載數據,然後將其傳遞到它所連接的活動或片段,從它在適配器中設置的位置absListView然後將其呈現給用戶如何在Realm中實現以下功能android

由於領域指出其objects shouldn't be shared across threads,如何在不從UI線程進行任何數據庫調用的情況下實現這一目標? (這將使應用程序遲緩的感覺,因爲我打的分貝量好)

另外在3 examples - introgridView & migration,多次數據庫操作都在UI線程中完成的。 UI線程中的數據庫操作不是嚴重在Android中皺起眉頭?

從文檔報價 - Potentially long running operations such as network or database operations, or computationally expensive calculations such as resizing bitmaps should be done in a worker thread (or in the case of databases operations, via an asynchronous request).

回答

4

你是對的,所以目前無法加載在後臺線程的項目,然後將其解析到UI線程。然而,在路線圖上,請看這裏:https://github.com/realm/realm-java/issues/503

儘管如此,對於較小的數據量,即使您在UI線程中加載數據,也可能不會跳過幀。

+0

不幸的是我處理大量的數據!在實施Realm之前,我將等待這個功能被敲定出來 – 2014-10-28 16:40:26

+0

您的案例中「多」是多少? – bmunk 2014-10-28 22:56:19

+0

@ChristianMelChior:嗨。 Realm是否支持自定義排序順序?例如,我有一個有3個字段的表格:地理位置的名稱,經度和緯度。我想根據距當前位置的距離對結果進行排序(這取決於用戶的位置)。謝謝 – Rajat 2015-03-04 07:01:51

2

當我第一次在他們的網站上看到關於領域的時候,我很高興看到他們的基準測試。但是,當我回到限制部分時,我在那裏呆了2分鐘,並且正在考慮「跨線程的對象共享預防」。從內部來看,它告訴我要走向世界,但那種限制讓我失望。所以最後我決定實現某種包裝,它允許我在所有線程中共享這個對象。

這是事情。 讀取和寫入磁盤的過程需要更多時間,然後創建簡單對象。這是我用包裝創建進行的一點。

1)我保留允許在任何地方創建realmObject的子類的對象,以抵抗它們在創建它的同一線程上的對象訪問規則。

例如

XyzsubclassofRealmObject xyzObject = new XyzsubclassofRealmObject(); 

2)傳遞該對象執行數據庫操作

例如該方法

insertOrUpdate(xyzObject); 

//implementation 
insertOrUpdate(XyzsubclassofRealmObject object) //you can make this method generic to accept any object that is subclass of RealmObject 
{ 
    Realm realm = Realm.getDefaultInstance(); 
    realm.beginTransaction(); 
    XyzsubclassofRealmObject databaseObject = realm.copyToRealmOrUpdate(object); 
    //notice this copyToRealmOrUpdate method provides by Realm 
    realm.commitTransaction(); 
    XyzsubclassofRealmObject copyObject = clone(databaseObject);   
    return copyObject; 
} 

3)現在也有兩點,他們提到,

  • 子RealmObject的只有默認的getter和setter方法,並允許要想我們的其他邏輯靜態方法。感謝上帝他們允許靜態方法。 :)

  • 它可以實現沒有方法的接口。 :(

我想克隆,從copyToRealmOrUpdate返回的databaseObject的。由於沒有方法接口允許(即第二點),第一個點來幫助我。

public static XyzsubclassofRealmObject clone(XyzsubclassRealmObject databaseObject) 
{ 
     XyzsubclassOfRealmObject obj = new XyzsubclassofRealmObject(); 
     obj.setXyz(databaseObject.getXyz()); 
     return obj; 
} 

而不是調用,如下所示直接克隆的方法,我用反射的方法來調用clone方法,我寫了通用包裝執行數據庫操作,而不是針對特定的模式。你可以自由選擇你自己的方式

就是這樣。你完成了。如您所見,我們正在返回複製的對象而不是數據庫對象,您可以在任何線程上自由使用它。 :)

結論:許多博客和博文都表明,它的性能如此之快,在執行交易時在UI線程上使用它很好。但選擇取決於你。您不會預先知道在應用程序使用量增加的時候數據從數據庫進入或離開的數量。如果該交易將有足夠的數據來讓你的用戶界面呆滯,它會。此外,我們所有的開發人員都已經練習在工作線程而不是UI線程上執行數據庫和網絡操作,因此它不會停止任何UI交互。閱讀

過程和寫入磁盤需要更多的時間,然後簡單 對象創建