[英]for-loop doesn't work in android try-catch block
我正在使用Realm建立我学校建筑物和教室的数据库。 但是,try-catch中的“ for-loop”不起作用:
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中,完成数据库的方法是完整的,没有Exception。 我很好奇这个数据库是对还是错。
因此,在第二次try-catch中,我试图通过查询检查领域文件。
问题是“ for-loop”在第二次try-catch中不起作用。 在摘要下方是我的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
我想用Log检查我的领域数据,但是,如您所见,它不起作用。
如果没有问题,日志记录器会显示我的许多建筑物和房间列表,并以“ D / Realm测试:2nd Try Catch Complete + 2376”结尾。
您能解释一下为什么它不起作用的原因吗? 即使没有异常,我也无法理解为什么它不起作用的原因。
在您的用例中,这并不构成问题,但是当您在事务内迭代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 < ...
很简单:没有抛出异常; 你只需要在循环内打印语句。
因此是一个唯一的结论:在执行for循环的那一刻,相应的列表为空 。 因此,不会输入循环体。 什么都不会打印。 这与该循环位于try-catch块内无关 。
这就是全部。 因此,直接的答案是: 直接在循环的前面打印列表大小,以避免出现此类意外情况。
(当然, 有趣的部分是了解列表发生了什么,而该列表在较早时似乎不是空的-但是要进行调试,您必须添加更多代码)。
尝试记录您的catch块。 很有可能是代码的其余部分,包括循环未完成,因为您的应用程序被异常捕获。
您应该调试buildingLists.size();
在for loop
之前
Log.d("Building List Size ", buildingLists.size()+"");
在这种情况下,您可以找到buildingLists.size();
的值buildingLists.size();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.