在sqlite数据库android中优化插入

时间:2015-06-06 08:23:53

标签: android sqlite

当我的桌子长大时,我在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因为它有风险。

有优化插入的任何解决方案吗?我的代码并不重要,它是简单的插入,但在大表中。 (列号和行号) 如果你想看到我的代码告诉我,我会发布

2 个答案:

答案 0 :(得分:0)

使用AsyncTask类执行任何后台作业。它在后台线程中完成工作,您的UI变得可用。通过重写AsyncTask类的doInBackground方法插入表中,如果要在插入重写onPostExecute方法后更新UI。请阅读AsyncTask了解详情。

答案 1 :(得分:0)

您必须使用尽可能多的插入事务。

有一种简单的方法可以自动将操作合并到相对较少的事务中:

  1. 将传入的操作放入队列。
  2. 只要队列不为空,就在单个事务中执行操作。
  3. 当队列变空时,提交事务。 (您还可以对单个事务中的操作数使用一些上限。)
  4. 当您收到的消息很少时,每个消息都会获得自己的事务。 当您收到许多传入消息时,此算法将生成大量事务。