1. 程式人生 > >Realm多執行緒中的那些坑...

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一份傳出來... 暫時就這些吧。

相關推薦

Realm執行那些...

個人在開發中遇到的一些小坑... 可能會持續更新... 1.RealmObject自帶執行緒保護功能,只能在建立它的執行緒中訪問,在子執行緒中不能訪問。 也就是說,如果你在主執行緒中new了一個RealmObject物件 user,那麼在子執行緒中是訪問不了user

web專案使用執行的一些

在web專案中有時候我們需要建立一個或者幾個執行緒去處理問題。線上程的業務處理方法裡面我們的寫法通常和mvc的業務層方法寫法類似。這時候有一個問題,如果業務方法丟擲了執行時異常(RuntimeException或其子類),在mvc專案中我們是不需要try-catch的,因為web專案通常

Java執行Synchronized簡介和Static Synchronized的區別

在進行Java開發時,多執行緒的開發是經常會使用的。首先會問一個小問題啊,在Java中有幾種方法可以建立一個執行緒? 我給的答案是3種。(如果還有其他的請留言告訴我哈。) 1、建立直接繼承自Thread類建立執行緒子類。   步驟如下:a 定義一個子類,同時

執行的佇列不一定需要執行安全

兩個執行緒,主執行緒中update update(){   while(queue.count >0){     //process....     queue.pop()   } }   子執行緒中: queue.enqueue(data)   這樣做是沒有問

junit測試和main方法執行遇到的問題

利用Junit測試多執行緒時經常遇到任務執行不完就會停止,下面是我的任務執行緒類: package timerTest; import java.io.BufferedReader; import java.io.BufferedWriter; import java.i

如何在執行執行注入bean

轉:https://segmentfault.com/q/1010000007172414?_ea=1264473 如何在多執行緒中注入bean?!​​​​​​​ 問題對人有幫助,內容完整,我也想知道答案0問題沒有實際價值,缺少關鍵內容,沒有改進餘地 前幾天,在sf這裡也提過這個問題,但

謹慎使用執行的fork

前言 在單核時代,大家所編寫的程式都是單程序/單執行緒程式。隨著計算機硬體技術的發展,進入了多核時代後,為了降低響應時間,重複充分利用多核cpu的資源,使用多程序程式設計的手段逐漸被人們接受和掌握。然而因為建立一個程序代價比較大,多執行緒程式設計的手段也就逐漸被人們認可和喜愛了。 記得在我剛

執行的鎖

樂觀鎖和悲觀鎖 樂觀鎖和悲觀鎖是在資料庫中引入的名詞,但是在併發包鎖裡面也引入了類似的思想,所以這裡還是有必要講解一下。 悲觀鎖指對資料被外界修改持保守的態度,認為資料很容易就會被其他執行緒修改,所以在資料被處理前就先對資料加鎖,並在整個資料處理過程中,使資料處於鎖定狀態,悲觀鎖的實現往往依靠資料庫

QT執行,物件訊號與槽連線不上的解決辦法

1、在接收者建立執行緒中,把接收者移動到主執行緒中: pReceiverObj->moveToThread(QApplication::instance()->thread()); 2、這樣傳送訊號的時候,就會在主執行緒事件佇列處理中來處理了。 把connect的最

執行的訊號機制--sigwait 函式

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java執行的異常處理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java執行顯式鎖的輪詢檢測策略

顯式鎖簡介 java5.0之前,在協調對共享物件的訪問時可以使用的機制只有synchronized和volatile,java5.0增加了一種新的機制:ReentrantLock。 鎖像synchronized同步塊一樣,是一種執行緒同步機制,與synchronized不同的是ReentrantLock提

C++執行的future(期望)

Providers std::promise 和std::future配合使用,給std::future傳遞期望值,下面是最簡單的一個用法: #include <iostream> #include <functional> #include <

Java執行注入Spring的Bean-使用靜態方法直接取的容器的spring物件

目前認為比較好的解決方案。 1,工具類 public class SpringApplicationContextHolder implements ApplicationContextAware { private static ApplicationContext context

spring的bean在執行注入的問題

問題描述 在spring中,如果需要在非同步執行緒中注入bean,會發現bean是空的情況。原因據說是spring bean 出於執行緒安全考慮,不得注入bean至執行緒類(Runnable)。 程式碼如下: public class DealThreadTask implem

執行自增AtomicInteger

AtomicInteger類的理解與使用 首先看兩段程式碼,一段是Integer的,一段是AtomicInteger的,為以下: public class Sample1 {     private static Integer count = 0;   &

32位jdk, long 型別的變數執行賦值操作問題

package im.zxd.test; public class LongTest {     public static  long num = 0;     public static final long value1=-1L;     public stati

python執行event的使用-----------------即一個靈活的方法標誌位,類似於java的等待喚醒機制(python與java不同的地方)

event是python中一個特有的標誌位方法,他一共有三種方法 1.event.wait():如果標誌位設定了,它不做任何事,如果沒有設定,則將會鎖住,等待標誌位的設定 2.event.set():設定標誌位 3.event.clear():清除標誌位 這一種機制很

執行CountDownLatch的含義以及和join的區別

任何執行緒,通常是應用程式的主執行緒,呼叫CountDownLatch.await()將等到計數達到零或被另一個執行緒中斷。所有其他執行緒都需要CountDownLatch.countDown()在完成或準備好後通過呼叫來倒計時。 一旦計數達到零,等待執行緒就會繼續。其中一

執行總記憶體和執行的工作記憶體

Java記憶體模型將記憶體分為了 主記憶體和工作記憶體 。類的狀態,也就是類之間共享的變數,是儲存在主記憶體中的,每個執行緒都有一個自己的工作記憶體(相當於CPU高階緩衝區,這麼做的目的還是在於進一步縮小儲存系統與CPU之間速度的差異,提高效能),每次Java