加快数据库插入速度

时间:2012-01-29 03:10:45

标签: java android database sqlite

我从XML解析数据并将其插入到我的数据库中。但这些最多1000个Querys必须在应用程序启动之前完成。
因为我必须使用FTS3搜索,插入会显着减慢。

在我添加FTS3搜索之前,我使用了BLOB。这很快。我怎样才能加快速度?

我使用这个FTS3表:

db.execSQL("CREATE VIRTUAL TABLE " + TABLE_FTS + " USING fts3(" + COL_ID + ", " + COL_KEY_ID + ", " + COL_KEY_NAME + ", "
            + COL_KEY_WEBURL + ", " + COL_KEY_MAINURL + ", " + COL_KEY_LOGO + " " + ");");

我用这个方法插入String:

      int init = 0;
      for(int t = init; t < arr.length; t++){
          Log.i(TAG, "arr["+t+"] = " + arr[t].trim());

        if(r == 1) {
            database.execSQL("INSERT INTO table (id) VALUES ('" + arr[t].trim() + "')");
            id_save = arr[t].trim();
            r++;
        }else if(r == 2) {
            database.execSQL("UPDATE table SET name='" + arr[t].trim() + "' WHERE id='" + id_save + "'");
            name_save = arr[t].trim();
            r++;
        }else if(r == 3) {
            database.execSQL("UPDATE table SET weburl='" + arr[t].trim() + "' WHERE id='" + id_save + "' AND name='" + name_save + "'");
            r++;
        }else if(r == 4) {
            database.execSQL("UPDATE tables SET mainurl='" + arr[t].trim() + "' WHERE id='" + id_save + "' AND name='" + name_save + "'");
            r++;
        }else if(r == 5) {
            database.execSQL("UPDATE table SET logo='" + arr[t].trim() + "' WHERE id='" + id_save + "' AND name='" + name_save + "'");
            r = 1;
        }

有没有什么好方法可以优化它? 非常感谢!

3 个答案:

答案 0 :(得分:2)

您需要批量插入的速度。

使用 DatabaseUtils.InsertHelper 代替 SQLiteDatabase.insert

答案 1 :(得分:1)

将此作为异步任务,并找出您的方法,如果您正在进行1000次查询,那么您已经遇到了设计问题。考虑改变你的方法。

答案 2 :(得分:1)

我同意最好的方法是使用线程,但是从UI的角度来看,以及Android推荐的内容(长任务可以被释放到更多重要任务的空闲空间),我建议使用一个Service。如果您可以管理作为服务运行大型流程,但在活动中接收更新(通过绑定或广播),则应该能够在执行所有处理时更新UI。

此外,关于JSON是否比XML更快还存在争议。对于这种复杂的东西,它可能值得尝试。

最后,考虑使用SharedPreferences缓存数据(特别是如果数据在会话之间不经常更改)。