我遇到了一些问题。我试图迭代一个光标来提取所需的数据。但是moveToNext()
方法似乎没有将光标移动到第一个位置。它将移动到第一行结果没有问题,但似乎它不会超过第一行并且每次都返回true。导致无限循环。这是我的代码:
此方法向数据库添加新项目:
public List<Items> getAllItems() {
SQLiteDatabase db = getWritableDatabase();
DatabaseParser parser = new DatabaseParser();
Cursor result = db.rawQuery("SELECT * FROM " + TableName.ITEMS.getName(), null);
List<Trip> items = parser.cursorToListOfItems(result);
Cursor moreResults = db.rawQuery("SELECT * FROM " + TableName.MORE_ITEMS.getName(), null);
List<MoreItems> moreItems = parser.cursorToListOfMoreItems(moreResults);
items = parser.combineListOfItemsWithListOfMoreItems(items, moreItems);
db.close();
result.close();
return items;
}
这是cursorToListOfItems()
方法,它将数据从光标中拉出并将其放入ArrayList
:
List<Items> cursorToListOfItems(Cursor data) {
List<Items> items = new ArrayList<Items>();
Items item = null;
if (data.moveToFirst()) {
do {
item = new Items(DataFactory.getDatabaseItemsData(data));
items.add(trip);
}
while (data.moveToNext());
}
return items;
}
现在我的问题是,在cursorToListOfItems()
中,对moveToNext()
的调用始终返回true,导致我的应用程序崩溃。
我尝试过的事
我尝试了不同的方法来迭代光标,没有任何变化。
我还删除了应用程序文件并卸载然后重新安装了应用程序,我仍然遇到同样的问题。
0
到1
的哪一行表示它已成功转到第一行然后第二。但在此之后,每次循环执行时,位置都保持为1.表示它永远不会超过第二行,以确定是否还有更多数据要执行,只返回启动无限循环的true
。我现在遇到了一堵砖墙。任何帮助,答案或建议引导我找到解决方案都非常感谢。
修改
我检查了日志,没有抛出异常。只有关于我最终得到的ANR的日志。但为了安全起见,我会在这里发布日志:
07-15 16:00:02.368 60-309 / system_process I / ActivityManager:从pid 441开始:Intent {cmp = com.eyephonegrourp.itruckit / .MainActivity} 07-15 16:00:02.518 441-441 / com.eyephonegrourp.itruckit D / dalvikvm:GC_EXTERNAL_ALLOC释放27K,52%免费2589K / 5379K,外部3399K / 3716K,暂停34ms
07-15 16:00:04.007 441-443 / com.eyephonegrourp.itruckit D / dalvikvm:GC_CONCURRENT释放701K,50%免费3421K / 6727K,外部3842K / 4311K,暂停3ms + 3ms
07-15 16:00:05.127 441-443 / com.eyephonegrourp.itruckit D / dalvikvm:GC_CONCURRENT释放698K,44%免费4285K / 7623K,外部3842K / 4311K,暂停3ms + 4ms
07-15 16:00:06.448 441-443 / com.eyephonegrourp.itruckit D / dalvikvm:GC_CONCURRENT释放866K,40%免费5298K / 8775K,外部3842K / 4311K,暂停3ms + 4ms
07-15 16:00:07.468 60-90 / system_process I / InputDispatcher:应用程序没有响应:Window {406fa4b8 com.eyephonegrourp.itruckit / com.eyephonegrourp.itruckit.SplashActivity paused = true}。事件发生5005.0ms,等待开始后5004.8ms 07-15 16:00:07.468 60-90 / system_process I / WindowManager:输入事件调度超时发送到com.eyephonegrourp.itruckit / com.eyephonegrourp.itruckit.SplashActivity
07-15 16:00:07.503 441-444 / com.eyephonegrourp.itruckit I / dalvikvm:threadid = 4:对信号3作出反应
07-15 16:00:07.557 441-444 / com.eyephonegrourp.itruckit I / dalvikvm:将堆栈跟踪写入&#39; /data/anr/traces.txt'
07-15 16:00:08.498 441-443 / com.eyephonegrourp.itruckit D / dalvikvm:GC_CONCURRENT释放940K,36%免费6405K / 9991K,外部3842K / 4311K,暂停3ms + 5ms
07-15 16:00:08.577 60-90 / system_process E / ActivityManager:AN.e in com.eyephonegrourp.itruckit(com.eyephonegrourp.itruckit / .MainActivity)
原因:keyDispatchingTimedOut
父:com.eyephonegrourp.itruckit / .SplashActivity
载荷:0.36 / 0.27 / 0.14
CPU使用率从47129ms到2463ms前:
4%60 / system_server:3.7%用户+ 0.2%内核/故障:1142次要
1.6%349 / com.android.launcher:1.3%用户+ 0.3%内核/故障:3315次要
0%40 / adbd:0%用户+ 0%内核/故障:13小调
0%135 / com.android.systemui:0%用户+ 0%内核/故障:4个未成年人 + 0%439 / sh:0%用户+ 0%内核
+ 0%440 / logcat:0%用户+ 0%内核
+ 0%441 / com.eyephonegrourp.itruckit:0%用户+ 0%内核
13%总计:11%用户+ 1.8%内核
CPU使用率从542ms到1077ms之后:
92%441 / com.eyephonegrourp.itruckit:92%用户+ 0%内核/故障:207个未成年人
71%441 / grourp.itruckit:71%用户+ 0%内核
20%443 / GC:20%用户+ 0%内核
5.5%60 / system_server:1.8%用户+ 3.7%内核/故障:1个未成年人
3.7%90 / InputDispatcher:1.8%用户+ 1.8%内核
1.8%61 / HeapWorker:0%用户+ 1.8%内核
1.8%73 / ActivityManager:1.8%用户+ 0%内核
98%总计:92%用户+ 5.5%内核
07-15 16:00:10.187 60-73 / system_process W / ActivityManager:强制完成活动com.eyephonegrourp.itruckit / .MainActivity
07-15 16:00:10.208 60-73 / system_process I / ActivityManager:杀死com.eyephonegrourp.itruckit(pid = 441):用户的请求
07-15 16:00:10.228 60-126 / system_process I / ActivityManager:进程com.eyephonegrourp.itruckit(pid 441)已经死亡。
07-15 16:00:10.238 60-90 / system_process E / InputDispatcher:channel&#39; 406fa4b8 com.eyephonegrourp.itruckit / com.eyephonegrourp.itruckit.SplashActivity(server)&#39; 〜消费者关闭输入通道或发生错误。事件= 0x8中
07-15 16:00:10.238 60-90 / system_process E / InputDispatcher:channel&#39; 406fa4b8 com.eyephonegrourp.itruckit / com.eyephonegrourp.itruckit.SplashActivity(server)&#39; 〜频道无法恢复,将被处理! 07-15 16:00:10.268 60-307 / system_process I / WindowManager:WIN DEATH:Window {406fa4b8 com.eyephonegrourp.itruckit / com.eyephonegrourp.itruckit.SplashActivity paused = true}
编辑2
这是您要求的日志:
07-15 16:13:19.738 1710-6219 / system_process I / ActivityManager:起始活动:来自pid 9583的Intent {cmp = com.eyephonegrourp.itruckit / .MainActivity}
07-15 16:13:19.908 9583-9583 / com.eyephonegrourp.itruckit D /数据库:dbopen():path = /data/data/com.eyephonegrourp.itruckit/databases/itruckit,flag = 6,文件大小= 11264
07-15 16:13:19.908 9583-9583 / com.eyephonegrourp.itruckit D /数据库:dbopen():path = /data/data/com.eyephonegrourp.itruckit/databases/itruckit,mode:wal,disk free size: 2538 M,句柄:0x3496e8
07-15 16:13:23.552 9583-9583 / com.eyephonegrourp.itruckit I / log-count:2
07-15 16:13:23.562 9583-9583 / com.eyephonegrourp.itruckit I / log-position:0
07-15 16:13:23.602 9583-9583 / com.eyephonegrourp.itruckit I / log-count:2
07-15 16:13:23.602 9583-9583 / com.eyephonegrourp.itruckit I / log-position:1
07-15 16:13:23.622 9583-9583 / com.eyephonegrourp.itruckit I / log-count:2
07-15 16:13:23.622 9583-9583 / com.eyephonegrourp.itruckit I / log-position:1
07-15 16:13:23.622 9583-9583 / com.eyephonegrourp.itruckit I / log-count:2
07-15 16:13:23.622 9583-9583 / com.eyephonegrourp.itruckit I / log-position:1
07-15 16:13:23.622 9583-9583 / com.eyephonegrourp.itruckit I / log-count:2
07-15 16:13:23.622 9583-9583 / com.eyephonegrourp.itruckit I / log-position:1
07-15 16:13:23.622 9583-9583 / com.eyephonegrourp.itruckit I / log-count:2
07-15 16:13:23.622 9583-9583 / com.eyephonegrourp.itruckit I / log-position:1
07-15 16:13:23.632 9583-9583 / com.eyephonegrourp.itruckit I / log-count:2
......不断重复...
编辑3
以下是DataFactory.getDatabaseItemsData(data)
的代码:
public static final DatabaseHelper.DatabaseTripData getDatabaseTripData(Cursor cursor) {
if (cursor.moveToFirst()) {
return createTripData(cursor.getLong(0), cursor.getInt(1), cursor.getInt(2),
cursor.getInt(3), cursor.getInt(4), cursor.getString(5),
cursor.getString(6), cursor.getLong(7), cursor.getLong(8),
cursor.getString(9), cursor.getString(10), cursor.getString(11));
}
return null;
}
所有createTripData()
都会从光标中获取数据并创建一个包装类来保存它。
答案 0 :(得分:2)
您的问题是getDatabaseItemsData
再次调用moveToFirst
。
您应该更改getDatabaseItemsData
,以便假定光标已经位于有效记录上,即只需删除moveToFirst
来电。
答案 1 :(得分:1)
您的应用程序因为您的操作处于UI线程(从数据库读取)而创建,您应该使用AsyncTask或Thread。
ANR in com.eyephonegrourp.itruckit (com.eyephonegrourp.itruckit/.MainActivity)
Reason: keyDispatchingTimedOut
ANR错误:活动没有响应。