Ускорить вставку базы данных - PullRequest
0 голосов
/ 29 января 2012

Я анализирую данные из XML и вставляю их в свою базу данных.Но это до 1000 запросов, которые должны быть выполнены до запуска приложения.
Поскольку я должен использовать поиск 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 + " " + ");");

и вставляю строку следующим образом:

      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 ]

2 голосов
/ 29 января 2012

Вам нужна скорость массовой вставки.

Используйте DatabaseUtils.InsertHelper вместо SQLiteDatabase.insert

1 голос
/ 29 января 2012

Я бы согласился, что лучшим подходом было бы использование многопоточности, однако с точки зрения пользовательского интерфейса, а также того, что рекомендуется Android (длинные задачи могут быть убиты, чтобы освободить место для более важных задач), я бы порекомендовал использоватьService.Если вы можете управлять запуском своего большого процесса как Службы, но получать обновления своей активности (посредством привязки или широковещательной рассылки), вы сможете обновлять пользовательский интерфейс при выполнении всей вашей обработки.

Кроме того, существуетнекоторые споры о том, быстрее ли JSON, чем XML.С чем-то таким сложным, возможно, стоит попробовать.

Наконец, рассмотрите возможность кэширования ваших данных с помощью SharedPreferences (особенно, если данные не часто меняются между сеансами).

1 голос
/ 29 января 2012

Сделайте это как асинхронную задачу и выясните свой подход. Если вы делаете 1000 запросов, у вас уже есть проблема с дизайном.Подумайте об изменении вашего подхода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...