2015-08-25 87 views
4

在爲對象查找查詢時,我得到「空」對象(非null,但未填充)。但是,在調試器中,我可以在對象描述中看到對象的數據(請參見下文)。我還使用Realm瀏覽器驗證了數據。我嘗試了不同的查詢查詢,查詢過濾條件,使用相同的Realm對象進行插入/查詢,使用不同的Realm對象進行插入/查詢,刷新領域等。Realm在空對象中查找結果

如果我將字段記錄在RealmObject I看到正確的數據打印出來。但是,我試圖按照https://realm.io/news/using-realm-with-rxjava/將這些模型轉換爲RxJava中使用的其他模型。

下面是一些重現問題的示例代碼。下面是在verifyRealm.close()時的截圖。

RealmTester realmTester1 = new RealmTester(); 
realmTester1.setFirstName("Tester1"); 
realmTester1.setLastName("ABC"); 
RealmTester realmTester2 = new RealmTester(); 
realmTester2.setFirstName("Tester2"); 
realmTester2.setLastName("XYZ"); 

Realm insertRealm = Realm.getDefaultInstance(); 
insertRealm.refresh(); 
insertRealm.beginTransaction(); 
insertRealm.copyToRealm(realmTester1); 
insertRealm.copyToRealm(realmTester2); 
insertRealm.commitTransaction(); 
insertRealm.close(); 

Realm verifyRealm = Realm.getDefaultInstance(); 
RealmResults<RealmTester> verifyTesters = verifyRealm.where(RealmTester.class).findAll(); 
verifyRealm.close(); 

我在調試器的截圖:http://i.stack.imgur.com/1UdRr.png

我使用v0.82.1。任何想法,爲什麼這裏的模型沒有填充?

+0

另請參見https://stackoverflow.com/questions/39144934/android-realm-findall-returns-objects-with-null-parameters – EpicPandaForce

回答

4

realm-java背後的想法是,我們從用戶的模型類生成Proxy類繼承,並覆蓋那裏的setters和getters。

由於Realm沒有設置它們,所以在調試器中看到模型字段的值爲null是完全正常的。 (零拷貝,Realm試圖通過管理本機代碼中的數據並在任何可能的時候共享它們來減少內存使用量。)

因此,當您想要訪問Realm模型的字段時,請始終使用setter和getters。檢查生成的Proxy類將幫助您理解這一點,實際上它非常簡單。它坐落在一個名爲像MyModelRealmProxy.java

構建目錄,還要檢查該section of the documents,它會爲您提供有關standalone對象以及如何將它們寫入境界一些想法。

+0

我錯過了指定使用getters/setters的文檔部分。我在每個Realm類中都有一個靜態方法來轉換爲一個新的對應模型類,並且我直接訪問Realm類的變量。切換使用getters/setters解決了這個問題。謝謝。 – dpalmer

+0

如何使用代理?你能給我一些例子代碼/?謝謝。 – herbertD

+1

@herbertD您不需要明確使用代理類。管理的Realm對象上的任何調用/字段訪問都通過代理類進行調用。請參閱https://realm.io/docs/java/latest/#what-is-the-difference-between-a-normal-java-object-and-a-realm-object – beeender