0

複数の挿入を取り巻く開始/終了トランザクションをサポートする SQLite を取得できません。

 Multiples INSERTs : 2500ms
 Using BEGIN and COMMIT : 90ms
 Using SELECT and UNION : 40ms

だから私はbeginとcommitを使って見ました。私は何を間違っていますか?

  // pseudocode: 
  ArrayList<Integer> iList = new ArrayList<Integer>();
    for (int i = 1; i <= 500; i++) {
      iList.add(i);
    }
  Collections.shuffle(iList);

  StringBuilder sb = new StringBuilder("begin transaction;");
  for (Integer i: iList) {
    sb.append("insert into \"t_order\" (qid) values(");
    sb.append(i);
    sb.append(");");
  }
  sb.append(" end transaction;");

  // from docs: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#execSQL(java.lang.String)
  // Execute a single SQL statement that is NOT a SELECT or any other SQL statement that returns data.
  m_db.execSQL(sb.toString());

OK、もう少し調査したところ、「セミコロンで区切られた複数のステートメントはサポートされていないようです。」挿入順序を挿入して保持するには、代わりに何ができますか?

4

4 に答える 4

2

トランザクションを開始し、個別のexecSQL()呼び出しで各 INSERT を実行してから、トランザクションをコミットします。

execSQL()同じ呼び出しで INSERT をまとめてクラスター化する必要はありません。

于 2012-06-21T02:20:21.130 に答える
2

SQLiteDatabase.beginTransaction()メソッドとメソッドを使用して、SQLiteDatabase.endTransaction()それらの間で execSQL 呼び出しを発行します。ContentValuesまた、独自の文字列連結を行う代わりに、構造体を使用する方がより良いスタイルになります。

ContentValues cv = new ContenValues();
m_db.beginTransaction();
try {
    for (Integer i: iList) {
        cv.put("qid", i);
        m_db.insert("t_order", null, cv);
    }
    m_db.setTransactionSuccessful();
} finally {
    m_db.endTransaction();
}
于 2012-06-21T02:20:55.480 に答える
0

beginTransaction()に関する Android の公式ドキュメントをご覧ください。「...」の部分を、個別の execSQL() 呼び出しを行うループに置き換えます。ステートメントを 1 つのバッファーでまとめて切り詰める必要はありません。

また、準備済みステートメントを使用する価値がある場合もよくあります。ステートメントを準備し、トランザクションを開始し、アイテムごとにループしてステートメントをバインドおよび実行し、最後にコミットします。

于 2012-06-21T02:35:36.797 に答える