0

我在这里阅读了几篇关于循环游标时速度问题的帖子,并尝试了这些帖子中给出的答案,例如不要在循环中使用 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 和 CL answer 的建议将速度从几分钟提高到几秒钟

4

1 回答 1

3

您的exportedInfo 字符串正在增长和增长。将结果保存在数组中并稍后进行字符串化(例如使用 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;
于 2013-08-04T19:30:49.300 回答