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