Realm多線程中的那些坑...

CristineFFJ 8年前發布 | 14K 次閱讀 web Struts Web框架

來自: http://blog.csdn.net/javine/article/details/51040110

 

個人在開發中遇到的一些小坑... 可能會持續更新...

 

1.RealmObject自帶線程保護功能,只能在創建它的線程中訪問,在子線程中不能訪問。

也就是說,如果你在主線程中new了一個RealmObject對象 user,那么在子線程中是訪問不了user對象的。

要想在子線程中訪問,必須先將user存入Ream中,然后在子線程中query出來。

 

2.如果Realm關閉,所有查詢得到的RealmObject都不能使用了。

如果想在子線程中去查詢數據,然后在主線程中使用是無法做到的。所以Realm提供的異步查詢就很重要了...

 

3.如果想在Realm.close()之后繼續操作查詢得到的對象,只能復制一份數據傳出來。

為防止Realm忘記關閉,個人喜歡將Realm的開啟和關閉封裝在一個函數中,想這樣

 

public User getRealmObject(String code){
Realm realm = Realm.getDefaultInstance();
User user = realm.where(User.class)
.equalTo("code" code)
.findFirst();
realm.close();
return user;
}

 

注意,上面的代碼是錯誤的!!!!查出來的user根本不能做任何操作!!!!

realm Colse掉之后,user對象就 不能訪問了,所以只能復制一份數據傳出來。

這個比較坑,Realm開發者是為了它的一個特色功能Auto-Update,即自動更新查詢到的數據,

特意讓查詢得到的數據與數據庫中的數據保持了同步,所以Realm一關,外面的數據也用不了。

而且,這個Auto-update暫時還無法關閉,stackOverFlow上有說以后可能會提供關閉這個功能的方法。

 

如果你的RealmObject非常復雜,要copy一份數據將會很麻煩...

而且這還不是最坑的,最坑的是下面這條。

 

4.如果直接修改或刪除query得到的數據,必須在transaction中完成...

也就是說,你根本不能把query返回的對象,當成普通對象去賦值或刪除,如果想要直接操作...ok,把對象copy一份傳出來...

 

暫時就這些吧。

 本文由用戶 CristineFFJ 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!