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


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

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一份傳出來...

臨時就這些吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM