2017-05-08 49 views
1

我正在用Realm製作我學校的建築物和教室的數據庫。但是, 'for循環' 中的try-catch不起作用:for循環在android try-catch塊中不起作用

public void startCheckRealm() { 
    // Writing DataBase with Realm 
    try { 
     Log.d("Realm", "Init"); 
     InitializeAPI.init_BuildingRoom(getActivity().getApplicationContext()); 
     Log.d("Realm", "Complete"); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 

    // Trying to check the Database whether it is right or wrong 
    try { 
     Log.d("Realm Test", "2nd Try Catch"); 

     Realm.init(getActivity().getApplicationContext()); 
     Realm realm = Realm.getDefaultInstance(); 

     RealmResults<BuildingList> buildingLists = realm.where(BuildingList.class).findAllSorted("buildingCode"); 

     int totalNumber = 0; 

     for(int i = 0; i < buildingLists.size(); i++) { 
      Log.d("For", "index = " + i); 
      RealmResults<RoomList> rooms = buildingLists.get(i).getRoomList().sort("roomCode"); 

      String BuildingName = buildingLists.get(i).getBuildingName(); 
      String BuildingCode = buildingLists.get(i).getBuildingCode(); 

      for(int idx = 0; idx < rooms.size(); idx++) { 
       totalNumber++; 
       String RoomCode = rooms.get(idx).getRoomCode(); 
       String RoomName = rooms.get(idx).getRoomName(); 

       Log.d("Realm Test", "Number :: " + String.valueOf(totalNumber) + " BuildingCode :: " + BuildingCode + "\t\t BuildingName :: " + BuildingName + "\t\t RoomCode :: " + RoomCode + "\t\t RoomName :: " + RoomName); 
      } 
     } 
     Log.d("Realm Test", "2nd Try Catch Complete + " + String.valueOf(totalNumber)); 
    } catch(RealmException e) { 
     e.printStackTrace(); 
    } 
} 

在第一個的try-catch的方法,它使得數據庫,是完全沒有異常。我很好奇這個數據庫是對還是錯。

因此,在第二次try-catch中,我試圖用查詢來檢查領域文件。

問題是「for-loop」在第二次嘗試中不起作用。下面的代碼片段是我的logcat。

D/Realm: Init 
I/System.out: bdList getLength :: 52 
I/System.out: roomList getLength :: 2376 
D/Realm: Complete 
D/Realm Test: 2nd Try Catch 
D/Realm Test: 2nd Try Catch Complete + 0 

我想檢查我的日誌數據的境界,但是,不工作,你可以看到。

如果沒有問題,logcat會顯示大量建築物和房間列表,並以「D/Realm Test:2nd Try Catch Complete + 2376」結尾。

你能解釋一下它不起作用的原因嗎?即使沒有例外,我也不明白爲什麼它不起作用的原因。

+2

buildingLists值是空的? – Jerry06

+0

您的查詢很可能是錯誤的,並且返回零記錄。我完全不熟悉Realm,但是你可以手動調查數據庫以查看記錄是否真的存在? –

+0

@ Jerry06也許沒有。 InitializeAPI.init_BuildingRoom(getActivity()getApplicationContext());在第一次嘗試抓住方法使52 buildingLists。您可以在logcat中看到buildingList的長度。 – TyeolRik

回答

2

雖然在您的用例中這不會造成問題,但當您在事務內迭代RealmResults時,結果將在每個版本< = 0.88.3和> = 3.0.0中生效。

在這種情況下

所以,

RealmResults<BuildingList> buildingLists = realm.where(BuildingList.class).findAllSorted("buildingCode"); 
    for(int i = 0; i < buildingLists.size(); i++) { 
     BuildingList buildingList = buildingLists.get(i); // <-- !!! 

將失敗(這將跳過每第二個項目!)

所以,你應該使用迭代器(3.0.0+!在< = 0.88.3你倒是做反向迭代)

RealmResults<BuildingList> buildingLists = realm.where(BuildingList.class).findAllSorted("buildingCode"); 
    for(BuildingList buildingList : buildingLists) { // <-- !!! 

之所以這樣的工作原理是因爲默認情況下迭代器創建一個新的快照集合(3.0.0+),並通過指數上的快照迭代也適用

OrderedRealmCollection<BuildingList> snapshot = buildingLists.createSnapshot(); 
for(int i = 0; i < ... 
+1

哇..我在一個月前在領域官方文檔中讀到了「快照」,但是,我沒有完全理解它。 (當然,我也不認爲「我應該使用它」),我必須閱讀這些內容。 :)感謝給我新的學習的東西! – TyeolRik

1

簡單:沒有拋出異常;並且您只有在循環內的打印語句

因此唯一的結論是:在執行for循環時,相應的列表爲爲空。因此循環體不被輸入;沒有打印。並且這有什麼也沒有這個事實,這個循環是在一個try-catch塊。

這就是這一切。所以,直接的答案是:在循環前面直接打印清單大小以避免此類意外。

(當然有趣部分是瞭解發生了什麼,這似乎是一個非空前面的列表中 - 但爲了調試,你就必須添加你的代碼中) 。

+0

是的,你是對的,列表大小爲0.但是,我很好奇爲什麼我的列表不會更新上述方法,名爲「InitializeAPI.init_BuildingRoom(getActivity()。getApplicationContext());」...我應該學習更多關於我的項目:( – TyeolRik

+0

當然。如果你找到答案中的一個「回答」這個問題,請考慮接受。就我個人而言,我建議你退後一步,創建一個[mcve]那個「列表不爲空然後變空」的問題,並寫出一個新問題 – GhostCat

0

嘗試記錄你的catch塊。包括循環在內的代碼的其餘部分沒有完成,因爲您的應用程序被捕獲到異常。

+0

我在catch塊中編寫了「e.printStackTrace();」是不是結束了?是否有更多的工作可以在logcat中打印錯誤日誌? – TyeolRik

+0

使用Log.e(TAG,「Message」 ,e); – paperflyy

1

兩個輸入: 1.Haven't使用境界,但看起來像語法越來越分類entriesis有點不同Official documentation

2.如果上述觀點是錯誤的比你的代碼看起來buildingList大小爲零。你有沒有試過檢查尺寸?

讓我知道結果。

+0

我認爲排序順利,但是,你是對的BuildingList.size()是0.我的logcat說「buildingLIsts.size()是0」:( – TyeolRik

+0

嘗試用我建議的鏈接說取代閱讀語法。讓我知道。請注意,如果謝謝。 :) – Shashank

0

for loop

Log.d("Building List Size ", buildingLists.size()+""); 

在這種情況下,你應該調試buildingLists.size();你可以找到的buildingLists.size();