InsertHelper を使用して SQLiteDatabaseに高速一括挿入を行うための回答とチュートリアルがたくさんあります。
ただし、InsertHelperは API 17 で廃止されました。
Android SQLite に大量のデータセットを一括挿入する最速の方法は何ですか?
これまでのところ、私の最大の懸念は、SQLiteStatementの操作があまり快適ではないことです。InsertHelper にはバインディング列とバインディング値があり、これは些細なことでした。
InsertHelper を使用して SQLiteDatabaseに高速一括挿入を行うための回答とチュートリアルがたくさんあります。
ただし、InsertHelperは API 17 で廃止されました。
Android SQLite に大量のデータセットを一括挿入する最速の方法は何ですか?
これまでのところ、私の最大の懸念は、SQLiteStatementの操作があまり快適ではないことです。InsertHelper にはバインディング列とバインディング値があり、これは些細なことでした。
SQLiteStatement にもバインディング メソッドがあり、SQLiteProgramを拡張します。
トランザクションで実行するだけです:
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
final SQLiteStatement statement = db.compileStatement(INSERT_QUERY);
db.beginTransaction();
try {
for(MyBean bean : list){
statement.clearBindings();
statement.bindString(1, bean.getName());
// rest of bindings
statement.execute(); //or executeInsert() if id is needed
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
編集
私はSQLiteQueryBuilderで良い解決策を見つけることができませんが、それは次のように簡単です:
final static String INSERT_QUERY = createInsert(DbSchema.TABLE_NAME, new String[]{DbSchema.NAME, DbSchema.TITLE, DbSchema.PHONE});
static public String createInsert(final String tableName, final String[] columnNames) {
if (tableName == null || columnNames == null || columnNames.length == 0) {
throw new IllegalArgumentException();
}
final StringBuilder s = new StringBuilder();
s.append("INSERT INTO ").append(tableName).append(" (");
for (String column : columnNames) {
s.append(column).append(" ,");
}
int length = s.length();
s.delete(length - 2, length);
s.append(") VALUES( ");
for (int i = 0; i < columnNames.length; i++) {
s.append(" ? ,");
}
length = s.length();
s.delete(length - 2, length);
s.append(")");
return s.toString();
}
私は同じ問題に直面していましたが、手動で SQL クエリを作成する必要があるため、SQLiteStatement が DatabaseUtils.InsertHelper を簡単に置き換える方法を見つけることができませんでした。
既存のコードを簡単に置き換えることができるSQLiteDatabase.insertOrThrowを使用することになりました。空の ContentValues を挿入するケースを処理するために、null 列のハックを追加するだけで済みました。
はい、ステートメントは後で再利用するためにコンパイルされていませんが、手動で INSERT クエリを作成し、すべてのパラメーターをバインドするのは面倒です。コードを変更した場合に、これが大規模な一括挿入データ セット (InsertHelper のみが非推奨) のパフォーマンスにどの程度影響するかを知りたいです。
InsertHelper に関連するコードのみを保持するデフォルト クラスのバックアップを作成しました。この要点を確認してください。
SDK utils クラスをクリーンアップするために、これが非推奨になったと確信しています。私のクラスに残っているのは、廃止されていないものだけを使用することです。
Google IO アプリ、特にproviderを確認することをお勧めします。これは、Google 開発者がこれを行う方法であるため、これが適切な方法であることを確認できます。