1

SQLite DB に行を挿入しようとしています。130 行を挿入するのに 7 秒かかります。これは遅いように思えます。

テーブルの定義は次のとおりです。

    sd.execSQL("CREATE TABLE " + V2VocabsTable.TABLE_NAME + " (" 
            + V2VocabsTable.ID   + " VARCHAR(10) PRIMARY KEY ," 
            + V2VocabsTable.NAME    + " VARCHAR(255), " 
            + V2VocabsTable.LOADED  + " VARCHAR(1) " 
            + ");"
            );

行を挿入するには、次のコードを使用します。

public void addTableStatus(String tableId, String name) {

    Log.d("DB","Before Insert");

    ContentValues cv = new ContentValues();
    cv.put(V2VocabsTable.ID, "Table " + tableId);
    cv.put(V2VocabsTable.NAME, name);
    cv.put(V2VocabsTable.LOADED, "NO");
    SQLiteDatabase sd = getWritableDatabase();
    long result = sd.insert(V2VocabsTable.TABLE_NAME,   null, cv);

    Log.d("DB","After Insert :: " + result);
    }

ログ ファイルの時刻は次のとおりです。

 12-17 23:00:11.445: D/SQLDB(25384): Init
 12-17 23:00:11.455: D/DB(25384): Before Insert
 12-17 23:00:11.505: D/SQLDB(25384): Open
 12-17 23:00:11.895: D/DB(25384): After Insert :: 1
 12-17 23:00:11.895: D/DB(25384): 0001 :: AdministrativeSex-v1.0.xml
 12-17 23:00:11.895: D/DB(25384): Before Insert
 12-17 23:00:11.965: D/DB(25384): After Insert :: 2
 12-17 23:00:11.965: D/DB(25384): 0002 :: MaritalStatus-v1.0.xml
 12-17 23:00:11.965: D/DB(25384): Before Insert
 12-17 23:00:12.005: D/DB(25384): After Insert :: 3
 12-17 23:00:12.005: D/DB(25384): 0004 :: PatientClass-v1.0.xml
 12-17 23:00:12.005: D/DB(25384): Before Insert
 12-17 23:00:12.145: D/DB(25384): After Insert :: 4

 12-17 23:00:18.815: D/DB(25384): Before Insert
 12-17 23:00:18.865: D/DB(25384): After Insert :: 131
 12-17 23:00:18.865: D/DB(25384): ZU057 :: LocationHiding-v1.0.xml
 12-17 23:00:18.865: D/DB(25384): Before Insert
 12-17 23:00:18.925: D/DB(25384): After Insert :: 132

これは私には非常に遅いように思えます。何が遅くなっているのでしょうか?

4

3 に答える 3

1
public DataBase openWithTrans() throws SQLException {
    ourHelper = new DataBaseHelper(ourContext, DATABASE_NAME,
            DATABASE_LOCATION);
    db = ourHelper.getWritableDatabase();
    db.beginTransaction();
    return this;
}

public void closeWithTrans() {
    try {

        db.setTransactionSuccessful();


    } catch (Exception e) {
        e.printStackTrace();
    }finally{

        db.endTransaction();
        Debug.debugMsg("end trans successful");
        db.close();
        Debug.debugMsg("close db successful");
        if (ourHelper != null) {
            ourHelper.close();
        }
    }

}

上記のコードにより、トランザクションを実行できるようになります。トランザクションモードでは、速度を大幅に上げることができるはずです。コメントで指摘されているように、トランザクションを開始し、x個の行を挿入して閉じます。

于 2012-12-18T00:37:24.157 に答える
0

IPC が関係しているため、DB 操作は非常に遅くなる可能性がありますが、SD カードのアクセス時間は測定していません。ただし、数百回の挿入を行う代わりに、bulkInsert または applyBatch を実行できます。遅い理由を調査する予定ですか、それともより速いアプローチを探していますか?

于 2012-12-17T23:19:17.863 に答える
0

別の方法として、構築可能なデータベース ファイルを assest に保持し、/data/data/XX/database の下にハード コピー/書き込みを行うことができます。

ワンショットインストールに適しています。

于 2012-12-17T23:33:40.413 に答える