2017-08-27 30 views
0

我們已經開始將Realm集成到我們的android項目中,並且遇到了一個小問題。 我們重新寫我們的DAO與境界,像這樣的例子:用關閉的交易書寫道域012

public class RealmAuthDao { 

    public static RealmAuthToken getAuthToken() { 
     Realm realm = RealmFactory.getAuthInstance(); 
     RealmAuthToken token = realm.where(RealmAuthToken.class).findFirst(); 

     return token; 
} 

但每隔幾分鐘得到了以下異常 -

「不可恢復的錯誤打開的文件太多的io_realm_internal_SharedGroup.cpp。 「

我們已經意識到,我們需要關閉,我們已經在整個應用程序打開的每個領域實例,所以我們嘗試這樣做:

public class RealmAuthDao { 

    public static RealmAuthToken getAuthToken() { 
     Realm realm = RealmFactory.getAuthInstance(); 
     RealmAuthToken token = realm.where(RealmAuthToken.class).findFirst(); 
     realm.close // close the instance we were using 

     return token; 
} 

但是,當我們這樣做時,無論何時我們嘗試訪問我們查詢的對象的成員或屬性,它都會失效,並拋出以下異常:

「此Realm實例已關閉,使其無法使用。 「

有沒有一種合適的方法來實現道界?或者我們應該每次直接從領域實例中進行查詢?

回答

0

我所做的是在我的活動中獲得我領域對象的實例並將其傳遞給dao類以進行查詢。他們在我的活動停止後關閉實例並且工作得很好,但我的dao方法並不是靜態的,儘管如此我需要dao的實例並將領域對象作爲構造函數參數傳遞。

0

是的,你需要關閉的領域實例,但你可能要read the documentation on best practices regarding opening and closing them - 特別是,你應該使用onCreate/onDestroy的活動/主線程,你應該使用try(Realm realm = Realm.getDefaultInstance()) {塊後臺線程,並且需要使用任何避孕方法領域應該將它作爲方法參數傳遞。

public static RealmAuthToken getAuthToken(Realm realm) { 
    return realm.where(RealmAuthToken.class).findFirst(); 
}