0

我遇到了一些问题。我正在尝试遍历游标以提取所需的数据。但是,这些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,这会导致我的应用程序崩溃。

我试过的东西

  1. 我尝试了不同的方式来迭代光标而没有改变。

  2. 我还删除了应用程序文件并卸载然后重新安装了应用程序,但我仍然遇到同样的问题。

  3. 我还连接了调试器以查看光标,我可以看到指示其所在行的标记,指示它成功地0转到1第一行,然后是第二行。但此后每次循环执行时,位置都保持在 1。表示它永远不会越过第二行以找出是否还有更多数据要执行,并且只返回true启动无限循环的数据。

我现在遇到了这堵砖墙。非常感谢任何能引导我找到解决方案的帮助、答案或建议。

编辑
我检查了日志并且没有抛出异常。只记录我最终得到的 ANR。但为了安全起见,我会在这里发布日志:

07-15 16:00:02.368 60-309/system_process I/ActivityManager: 开始: Intent { cmp=com.eyephonegrourp.itruckit/.MainActivity } 从 pid 441
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 释放 507 % free 3421K/6727K, external 3842K/4311K, paused 3ms+3ms
07-15 16:00:05.127 441-443/com.eyephonegrourp.itruckit D/dalvikvm: GC_CONCURRENT freed 698K, 44% free 4285K/7623K, external 3842K/ 4311K, 暂停 3ms+4ms
07-15 16:00:06.448 441-443/com.eyephonegrourp.itruckit D/dalvikvm: GC_CONCURRENT freed 866K, 40% free 5298K/8775K, external 3842K/4311K, paused 3ms+4ms
07-15 16:00:07.468 60-90/system_process I/InputDispatcher:应用程序没有响应:窗口{406fa4b8 com.eyephonegrourp.itruckit/com.eyephonegrourp.itruckit.SplashActivity paused=true}。事件后 5005.0 毫秒,等待开始
后 5004.8 毫秒 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: 写了堆栈跟踪到'/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:com.eyephonegrourp.itruckit 中的 ANR (com.eyephonegrourp.itruckit/.MainActivity)
原因:keyDispatchingTimedOut
父级:com.eyephonegrourp.itruckit/.SplashActivity
负载:0.36 / 0.27 / 0.14
CPU 使用率从 47129ms 到2463 毫秒前:
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 使用率从 542 毫秒到 1077 毫秒后:
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% user + 0% kernel
98% TOTAL: 92% user + 5.5% kernel
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: Killing 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: 通道 '406fa4b8 com.eyephonegrourp.itruckit/com.eyephonegrourp.itruckit.SplashActivity (server)' ~ 消费者关闭输入通道或发生错误。事件=0x8
07-15 16:00:10.238 60-90/system_process E/InputDispatcher: 频道 '406fa4b8 com.eyephonegrourp.itruckit/com.eyephonegrourp.itruckit.SplashActivity (server)' ~ 频道已不可恢复地损坏,将被处理掉!
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:开始活动:意图 { cmp=com.eyephonegrourp.itruckit/.MainActivity } 来自 pid 9583
07-15 16:13:19.908 9583-9583/com。 eyephonegrourp.itruckit D/数据库:dbopen():路径 = /data/data/com.eyephonegrourp.itruckit/databases/itruckit,标志 = 6,文件大小 = 11264
07-15 16:13:19.908 9583-9583/com。 eyephonegrourp.itruckit D/Database: dbopen(): path = /data/data/com.eyephonegrourp.itruckit/databases/itruckit, 模式: wal, 磁盘可用大小: 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-位置: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()的就是从游标中获取数据并创建一个包装类来保存它。

4

2 回答 2

2

你的问题是再次getDatabaseItemsData调用。moveToFirst

您应该进行更改getDatabaseItemsData,使其假定光标已经位于有效记录上,即,只需删除moveToFirst调用。

于 2013-07-16T06:55:55.403 回答
1

由于您的操作在 UI 线程中(从 db 读取),因此您的应用程序崩溃了,您应该使用 AsyncTask 或 Thread。

ANR in com.eyephonegrourp.itruckit (com.eyephonegrourp.itruckit/.MainActivity)
Reason: keyDispatchingTimedOut

ANR 错误:活动无响应。

于 2013-07-15T21:13:01.110 回答