通过光标迭代,moveToNext()似乎不起作用

时间:2013-07-15 20:51:38

标签: android sqlite iterator cursor

我遇到了一些问题。我试图迭代一个光标来提取所需的数据。但是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. 我还连接了调试器以查看光标,我可以看到标记指示它从01的哪一行表示它已成功转到第一行然后第二。但在此之后,每次循环执行时,位置都保持为1.表示它永远不会超过第二行,以确定是否还有更多数据要执行,只返回启动无限循环的true
  4. 我现在遇到了一堵砖墙。任何帮助,答案或建议引导我找到解决方案都非常感谢。

    修改
    我检查了日志,没有抛出异常。只有关于我最终得到的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()都会从光标中获取数据并创建一个包装类来保存它。

2 个答案:

答案 0 :(得分:2)

您的问题是getDatabaseItemsData再次调用moveToFirst

您应该更改getDatabaseItemsData,以便假定光标已经位于有效记录上,即只需删除moveToFirst来电。

答案 1 :(得分:1)

您的应用程序因为您的操作处于UI线程(从数据库读取)而创建,您应该使用AsyncTask或Thread。

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

ANR错误:活动没有响应。