迭代光标时插入db

时间:2014-04-29 18:32:18

标签: android database sqlite insert android-cursor

我的游标包含数据库中的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();
}

1 个答案:

答案 0 :(得分:0)

当您进行单独插入时,每个插入实际上都包含在SQLite事务中。如果您在单个事务中执行所有插入操作,则应该大大加快速度。

db.beginTransaction();
try {
    // do your inserts

    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}