Android:批量插入,当InsertHelper不推荐时

Android:批量插入,当InsertHelper不推荐时,android,sqlite,android-contentprovider,bulkinsert,android-sqlite,Android,Sqlite,Android Contentprovider,Bulkinsert,Android Sqlite,有很多答案和教程可用于在SQLiteDatabase中进行快速批量插入。 但从API 17开始,已弃用 在Android SQLite中批量插入大数据集的最快方法是什么 到目前为止,我最担心的是,InsertHelper有绑定列和绑定值,这有点微不足道。我建议你看看google,尤其是,google开发者就是这样做的,因此,您可以确定这是正确的方法。SQLiteStatement也有绑定方法,它扩展了 只需在事务中运行它: final SQLiteDatabase db = mOpenH

有很多答案和教程可用于在SQLiteDatabase中进行快速批量插入。
但从API 17开始,已弃用

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


到目前为止,我最担心的是,InsertHelper有绑定列和绑定值,这有点微不足道。我建议你看看google,尤其是,google开发者就是这样做的,因此,您可以确定这是正确的方法。

SQLiteStatement也有绑定方法,它扩展了

只需在事务中运行它:

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

编辑

我在中找不到好的解决方案,但它非常简单:

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();
}
final static String INSERT_QUERY=createInsert(DbSchema.TABLE_NAME,新字符串[]{DbSchema.NAME,DbSchema.TITLE,DbSchema.PHONE});
静态公共字符串createInsert(最终字符串表名,最终字符串[]列名){
if(tableName==null | | columnNames==null | | columnNames.length==0){
抛出新的IllegalArgumentException();
}
最终StringBuilder s=新StringBuilder();
s、 追加(“插入”)。追加(表名)。追加(“”);
for(字符串列:列名称){
s、 追加(列)。追加(“,”);
}
int length=s.length();
s、 删除(长度-2,长度);
s、 附加(“)值(”);
for(int i=0;i
我也面临同样的问题,无法找到SQLiteStatement如何轻松替换DatabaseUtils.InsertHelper,因为您需要手动构建SQL查询

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


是的,该语句不会被编译以供以后重用,但是手工构建插入查询并绑定所有参数太麻烦了。如果您修改代码,我想知道这对大容量插入数据集(InsertHelper只是不推荐使用)的性能有多大影响。

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


我敢肯定,为了清理SDK utils类,这是不推荐的。我的类只剩下未弃用的东西。

这很好,但是
插入\u查询
必须是纯文本编写的查询,带有内容值占位符
,这对于大型数据集来说很不舒服,不是吗?是的,可能会有帮助?在答案中添加一些示例代码,我想这可能是解决方案,我会接受你之后。谢谢你的代码。。。请注意,绑定索引是基于1的。。。。您可能想更正这个问题。Is
语句.execute()
比直接使用
db.insert()
更好吗?似乎额外增加了几行代码并没有多少好处。因为(新的URL)甚至没有实现bulkInsert,我认为他们并没有关注速度。