ここで、カーソルをループするときの速度の問題に関するいくつかの投稿を読み、これらの投稿に記載されている回答を試しました。たとえば、ループ呼び出しで 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) 作成されたかどうかを確認する方法ですか? 2 つのインデックスは、1 つ目の ID と、年、月、日、時間、分、秒をすべて Long Integer で保持するフィールドに基づいていました。
ループが多くのレコードを読み取るのにこれほど時間がかかっているように見えることを懸念しています。
アップデート:
rtsai2000 と CL answer からの提案により、速度が数分から数秒に向上しました