android用光标速度循环通过数据库

时间:2013-08-04 16:04:14

标签: android sqlite while-loop cursor

我在这里阅读了几篇关于速度问题的帖子,这些帖子在循环游标时尝试了这些帖子中给出的答案,例如不要在循环中使用getcolumnindex这一次调用等。

然而,如果数据库有大约2400条记录,则需要大约3到5分钟才能完成。

循环在异步任务方法中运行,因此它不会挂断设备,并且数据库是通过数据库适配器处理的。

循环代码如下:

    while (!exportrec.isAfterLast()) {
                    if ( exportrec.moveToNext() ) {
                    fulldate =  exportnumberformatter(exportrec.getInt(daye))
                            +"/"+exportnumberformatter(exportrec.getInt(monthe))+"/"
                            +String.valueOf(exportrec.getInt(yeare));

                    fulltime =  exportnumberformatter(exportrec.getInt(houre))+":"
                            +exportnumberformatter(exportrec.getInt(mine))+":"
                            +exportnumberformatter(exportrec.getInt(sece));

                    noiseid = exportrec.getInt(typee);
                    exportedinfo += exporttypes[id] +","+exportrec.getString(notee)+","+
                            fulldate+","+fulltime+" \n" ;  
                    } 
 }

exportnumberformatter执行以下操作:

 public String exportnumberformatter(int i) {
            String result = Integer.toString(i);

            if (result.length() >1 ) {

             return Integer.toString(i);
             }

           String zeroprefix = "";
           zeroprefix = "0"+result;


              return zeroprefix ;
        }

在循环之前调用游标以获取数据:

exportrec = MD.GetAllLogs(2, "date_sort");
exportrec.moveToFirst();

MD是数据库适配器和GetAllLogs方法(已经尝试使用它来加速,所以这里使用的date_sort确实被忽略了):

public Cursor GetAllLogs(Integer i,String sortfield)
        {
            String sorted = "";
            if (i == 1 ) {
                sorted = "DESC";
            } else if (i == 2) {
                sorted = "ASC";
            } 


            return mDB.query(DB_TABLE, new String[] {COL_ID, COL_TYPE,COL_IMAGE, COL_INFO,COL_IMAGE,COL_HOUR,COL_SEC,COL_MIN,COL_DAY,COL_MON,COL_YEAR,COL_SORT_DATE},
                            null, null, null, null, COL_ID+" "+sorted);
        }

当我在数据库中创建表时,它没有索引,所以我通过升级方法创建了这些。但是当我这样做时它们没有错误或者看起来失败但是我不知道的是A)数据库/表是否需要在创建索引后重建并且B)如何判断它们是否已经创建?这两个索引基于ID作为第一个,而一个字段在Long Integer上保存年月日小时分钟。

我担心循环似乎需要很长时间来阅读这么多记录。

更新

rtsai2000's和CL回答的建议将速度从几分钟提高到几秒

1 个答案:

答案 0 :(得分:3)

您的exportedInfo字符串正在增长和增长。将结果保存在数组中并稍后将Stringify保存(例如使用StringBuilder)。

阅读记录后,您没有关闭光标。

List<String> exportedInfo = new ArrayList<String>();
Cursor exportrec = GetAllLogs();
try {
  while (exportrec.moveToNext()) {
    String info = String.format("%s, %s, %02d/%02d/%02d, %02d:%02d:%02d",
      exporttypes[id],
      exportrec.getString(notee),
      exportrec.getInt(daye),
      exportrec.getInt(monthe),
      exportrec.getInt(yeare),
      exportrec.getInt(houre),
      exportrec.getInt(mine),
      exportrec.getInt(sece));  
    exportedInfo.add(info);
  }
} finally {
  exportrec.close();
}
return exportedInfo;