有很多答案和教程使用InsertHelper在 SQLiteDatabase 中进行快速批量插入。
但是从 API 17 开始不推荐使用InsertHelper。
现在在 Android SQLite 中批量插入大量数据的最快方法是什么?
到目前为止,我最担心的是SQLiteStatement使用起来不太舒服,其中 InsertHelper 具有绑定列和绑定值,这有点微不足道。
有很多答案和教程使用InsertHelper在 SQLiteDatabase 中进行快速批量插入。
但是从 API 17 开始不推荐使用InsertHelper。
现在在 Android SQLite 中批量插入大量数据的最快方法是什么?
到目前为止,我最担心的是SQLiteStatement使用起来不太舒服,其中 InsertHelper 具有绑定列和绑定值,这有点微不足道。
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();
}
我遇到了同样的问题,找不到 SQLiteStatement 如何轻松替换 DatabaseUtils.InsertHelper,因为您需要手动构建 SQL 查询。
我最终使用了可以轻松替换现有代码的SQLiteDatabase.insertOrThrow 。我有时只需要添加一个空列 hack 来处理我插入空 ContentValues 的情况。
是的,该语句没有编译为以后重用,但是手动构建一个 INSERT 查询并绑定所有参数太痛苦了。如果您修改代码,我很想知道这对大型批量插入数据集(仅不推荐使用 InsertHelper)的性能有多大影响。
我刚刚备份了默认类,只保留了与 InsertHelper 相关的代码,请查看此要点。
我很确定这已被弃用以清理 SDK utils 类。我的课剩下的只是使用非弃用的东西。