Android:批量插入,但不建议使用InsertHelper吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

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

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

提问于
用户回答回答于

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();
}
用户回答回答于

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

扫码关注云+社区