安卓:批量插入,当InsertHelper被弃用(Android: Bulk Insert, whe

2019-07-18 06:42发布

有很多使用的答案和教程InsertHelper做快速批量插入在SQLiteDatabase。
但InsertHelper被弃用API 17。

现在什么是批量最快的方法插入大型数据集在Android的SQLite的?

到目前为止,我最担心的是SQLiteStatement不是很舒服的工作,在那里InsertHelper有约束力的列和结合的价值观,这是一种微不足道的。

Answer 1:

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();
}


Answer 2:

我建议你看一看谷歌IO应用特别是供应商 ,这是谷歌开发人员如何做到这一点,所以你可以肯定, 是正确的方式。



Answer 3:

我面临着同样的问题,但没有找到SQLiteStatement怎么可能轻易更换DatabaseUtils.InsertHelper,你需要建立手工SQL查询。

最后我用SQLiteDatabase.insertOrThrow它可以很容易地替换现有的代码。 我只需要有时候一个空列添加砍来处理,我插入空ContentValues情况。

是的声明不编译稍后重用,但建设用手INSERT查询并结合所有的参数是太痛了。 我很想知道有多少对大批量插入数据集这一冲击性能(InsertHelper只是不建议使用)的情况下,您修改代码。



Answer 4:

我只是做了默认的类只保留相关InsertHelper代码的备份,检查出这个要点 。

我敢肯定,这是过时的清理SDK utils的类。 剩下什么我的同班同学只使用非过时的东西。



文章来源: Android: Bulk Insert, when InsertHelper is deprecated