当我的桌子长大时,我在sqlite
数据库中有多个插入问题。
在表中有200个插入我面对冻结UI甚至我在后台线程中编写了我的插入查询。 (可能是同步方法导致此问题,数据库正忙,读取必须锁定,直到插入完成)
我看到This Link非常有助于理解我可以在数据库中自定义的许多选项。但我不能使用除SYNCHRONIZE之外的任何一个。
我认为使用Prepared Statement但是当我使用内容提供商并且我看到源代码时,内容提供商默认使用它。
以下代码来自源:
public long insertWithOnConflict(String table, String nullColumnHack,
ContentValues initialValues, int conflictAlgorithm) {
acquireReference();
try {
StringBuilder sql = new StringBuilder();
sql.append("INSERT");
sql.append(CONFLICT_VALUES[conflictAlgorithm]);
sql.append(" INTO ");
sql.append(table);
sql.append('(');
Object[] bindArgs = null;
int size = (initialValues != null && initialValues.size() > 0)
? initialValues.size() : 0;
if (size > 0) {
bindArgs = new Object[size];
int i = 0;
for (String colName : initialValues.keySet()) {
sql.append((i > 0) ? "," : "");
sql.append(colName);
bindArgs[i++] = initialValues.get(colName);
}
sql.append(')');
sql.append(" VALUES (");
for (i = 0; i < size; i++) {
sql.append((i > 0) ? ",?" : "?");
}
} else {
sql.append(nullColumnHack + ") VALUES (NULL");
}
sql.append(')');
SQLiteStatement statement = new SQLiteStatement(this, sql.toString(), bindArgs);
try {
return statement.executeInsert();
} finally {
statement.close();
}
} finally {
releaseReference();
}
}
告诉我它是不是正确。
我不能在这种情况下使用Transaction
,因为我不知道收到的消息何时结束。我不能等待或插入延迟,以获得下一条消息
我也不能使用journal_mode = MEMORY
因为它有风险。
有优化插入的任何解决方案吗?我的代码并不重要,它是简单的插入,但在大表中。 (列号和行号) 如果你想看到我的代码告诉我,我会发布
答案 0 :(得分:0)
使用AsyncTask类执行任何后台作业。它在后台线程中完成工作,您的UI变得可用。通过重写AsyncTask类的doInBackground方法插入表中,如果要在插入重写onPostExecute方法后更新UI。请阅读AsyncTask了解详情。
答案 1 :(得分:0)
您必须使用尽可能多的插入事务。
有一种简单的方法可以自动将操作合并到相对较少的事务中:
当您收到的消息很少时,每个消息都会获得自己的事务。 当您收到许多传入消息时,此算法将生成大量事务。