18

InsertHelper を使用して SQLiteDatabaseに高速一括挿入を行うための回答とチュートリアルがたくさんあります。
ただし、InsertHelperは API 17 で廃止されました。

Android SQLite に大量のデータセットを一括挿入する最速の方法は何ですか?

これまでのところ、私の最大の懸念は、SQLiteStatementの操作があまり快適ではないことです。InsertHelper にはバインディング列とバインディング値があり、これは些細なことでした。

4

4 に答える 4

26

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();
}
于 2013-01-15T19:00:36.283 に答える
1

私は同じ問題に直面していましたが、手動で SQL クエリを作成する必要があるため、SQLiteStatement が DatabaseUtils.InsertHelper を簡単に置き換える方法を見つけることができませんでした。

既存のコードを簡単に置き換えることができるSQLiteDatabase.insertOrThrowを使用することになりました。空の ContentValues を挿入するケースを処理するために、null 列のハックを追加するだけで済みました。

はい、ステートメントは後で再利用するためにコンパイルされていませんが、手動で INSERT クエリを作成し、すべてのパラメーターをバインドするのは面倒です。コードを変更した場合に、これが大規模な一括挿入データ セット (InsertHelper のみが非推奨) のパフォーマンスにどの程度影響するかを知りたいです。

于 2013-01-16T17:12:34.810 に答える
1

InsertHelper に関連するコードのみを保持するデフォルト クラスのバックアップを作成しました。この要点を確認してください。

SDK utils クラスをクリーンアップするために、これが非推奨になったと確信しています。私のクラスに残っているのは、廃止されていないものだけを使用することです。

于 2013-04-04T13:18:03.927 に答える
1

Google IO アプリ、特にproviderを確認することをお勧めします。これは、Google 開発者がこれを行う方法であるため、これが適切な方法であることを確認できます。

于 2013-01-15T18:29:56.783 に答える