18

有很多答案和教程使用InsertHelper在 SQLiteDatabase 中进行快速批量插入。
但是从 API 17 开始不推荐使用InsertHelper

现在在 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

我建议你看看 google IO app特别是provider,这就是 google 开发人员这样做的方式,所以你可以确定是正确的方法。

于 2013-01-15T18:29:56.783 回答
1

我遇到了同样的问题,找不到 SQLiteStatement 如何轻松替换 DatabaseUtils.InsertHelper,因为您需要手动构建 SQL 查询。

我最终使用了可以轻松替换现有代码的SQLiteDatabase.insertOrThrow 。我有时只需要添加一个空列 hack 来处理我插入空 ContentValues 的情况。

是的,该语句没有编译为以后重用,但是手动构建一个 INSERT 查询并绑定所有参数太痛苦了。如果您修改代码,我很想知道这对大型批量插入数据集(仅不推荐使用 InsertHelper)的性能有多大影响。

于 2013-01-16T17:12:34.810 回答
1

我刚刚备份了默认类,只保留了与 InsertHelper 相关的代码,请查看此要点

我很确定这已被弃用以清理 SDK utils 类。我的课剩下的只是使用非弃用的东西。

于 2013-04-04T13:18:03.927 回答