2017-01-21 54 views
0

我插入來自ContentObserver記錄在Android服務一樣:查詢域是否與Oracle一樣查詢讀一致性?

try { 
     realm.beginTransaction(); 
     realm.copyToRealm(sms); 
     realm.commitTransaction(); 
    } catch (RealmException re) { 
     realm.cancelTransaction(); 
    } 

然後在另一個服務我運行下面的查詢JobService:

Realm realm = Realm.getDefaultInstance(); 
    RealmQuery<Sms> query = realm.where(Sms.class); 
    RealmResults<Sms> sms = query.findAll(); 

    ArrayList<Sms> smsArrayList = new ArrayList<>(); 
    smsArrayList.addAll(sms); 

    for (Sms sms : smsArrayList) { 
     process row 
     delete row 
    } 

是隻讀的,一致的點查詢時間,就像甲骨文?

如果查詢運行一段時間並從其他服務插入新數據會發生什麼?

我喜歡我的查詢是一致的。查詢開始後插入的新記錄不應被看到或被包含。這是這種情況,或者我應該如何編碼?

我需要確保正確處理作業隊列中的記錄,並且我想避免兩次讀取同一作業或因其他服務插入而混淆。 所以我想做一個for循環RealmResults < <短信>>,處理它,刪除行。

然後在某個時間點再次啓動查詢並處理新記錄。

+0

你提交的事務如果在你的代碼只在看什麼? – Divers

+0

這與我的問題無關,將其刪除。 – powder366

+0

取決於您所在的線程。循環線程autoupdate,非循環線程不。 – EpicPandaForce

回答

1

在循環線程上,領域(和領域結果和領域對象)會自動更新。您可以致電setAutoRefreshhttps://realm.io/docs/java/latest/api/io/realm/Realm.html#setAutoRefresh-boolean-)禁用此功能。或者,您可以開始寫入事務。

所以,你可以這樣做:

Realm realm = Realm.getDefaultInstance(); 
realm.setAutoRefresh(false); 
// do all your reads here ... 
realm.waitForChange(); // to update the instance if other threads have commit changes 

或者:

Realm realm = Realm.getDefaultInstance(); 
realm.writeTransaction(); // will wait if another write transaction is in progress 
// do all your reads here ... 
realm.cancelTransaction(); // no writes :-) 
+0

感謝您的回答。在代碼或https://realm.io/docs/java/latest/api/ – powder366

+0

中找不到方法writeTransaction()。對不起,我的意思是'beginTransaction'(它將開始一個寫事務)。 – geisshirt