我的游标包含数据库中的3列。我需要迭代,并将ID添加到另一个表。我尝试使用下面的代码,但它导致"应用程序没有响应"消息,并花了大约10秒钟插入所有行(约1000)。
我已经更改了代码,以便我遍历游标并单独插入数据库,现在大约需要500毫秒。虽然我似乎已经解决了我的问题,但我不明白为什么。
有人可以解释一下为什么下面的代码要执行这么长时间吗?
public void setNowPlayingSongs(SQLiteDatabase db, Cursor cursor) {
// Clear all the current songs
db.delete(TABLE_NOW_PLAYING, null, null);
ContentValues cv = new ContentValues();
cursor.moveToFirst();
int index = cursor.getColumnIndex(COL_ID);
while (!cursor.isAfterLast()){
cv.put(COL_SONG_ID, cursor.getInt(index));
db.insert(TABLE_NOW_PLAYING, null, cv);
cursor.moveToNext();
}
}
为什么这么快?我不明白为什么循环游标然后遍历列表会更快。我认为上面的方法应该更快?
public void setNowPlayingSongs(SQLiteDatabase db, Cursor cursor) {
ContentValues cv;
List<Integer> ids;
int index;
// Clear all the current songs
db.delete(TABLE_NOW_PLAYING, null, null);
// Check which column holds the IDs
index = cursor.getColumnIndex(COL_ID);
// Add the ids to a list
ids = new ArrayList<Integer>();
cursor.moveToFirst();
while (!cursor.isAfterLast()) {
ids.add(cursor.getInt(index));
cursor.moveToNext();
}
// Insert the IDs into the now playing table.
cv = new ContentValues();
db.beginTransaction();
for (Integer id : ids) {
cv.put(COL_SONG_ID, id);
db.insert(TABLE_NOW_PLAYING, null, cv);
}
db.setTransactionSuccessful();
db.endTransaction();
}
答案 0 :(得分:0)
当您进行单独插入时,每个插入实际上都包含在SQLite事务中。如果您在单个事务中执行所有插入操作,则应该大大加快速度。
db.beginTransaction();
try {
// do your inserts
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}