Производительность SQLite Issue - Может ли обмен кодами ускорить процесс? - PullRequest
0 голосов
/ 06 ноября 2011

Я использую следующий код для добавления строк в свою базу данных:

    public void insert(String kern, String woord) {
      SQLiteDatabase db = getWritableDatabase();

      ContentValues values = new ContentValues();
      values.put(KERN, kern);
      values.put(WOORD, woord);

      db.insertOrThrow(TABLE_NAME, null, values);
      return;

В настоящее время я вызываю эту вставку () 3,445 раза, чтобы добавить все слова в базу данных, используя: insert("Fruits", "Banana");Это занимает вечность.

Как я могу изменить этот код, чтобы он работал быстрее?Я думаю по линии foreach, но не знаю, как реализовать .. Спасибо!

/ Edit;Решение, предоставленное @hovanessyan, работает и будет работать.И ... обратите внимание, что если вам нужно вставить много строк, вы можете столкнуться с тем, что метод превышает ошибку ограничения максимального байта.В этом случае просмотрите другое решение, которое предлагает упаковать базу данных в фактический файл .APK.

Ответы [ 3 ]

4 голосов
/ 06 ноября 2011

Вы можете заключить эти вставки в транзакцию.

db.beginTransaction();
 try {
  // do all the inserts here

  //method call here, that does 1 insert; For example
  addOneEntry(kern,woord);
  ... 
  db.setTransactionSuccessful();
 } catch (SQLException e) {
         //catch exceptions
 } finally {
   db.endTransaction();
 }


 private void addOneEntry(String kern, String woord) {
   //prepare ContentValues
   //do Insert
 }
0 голосов
/ 07 ноября 2011

Используя советы как Ованесяна, так и Дамиана (напомните мне, чтобы я ответил вам +1, как только я достигну 15;), я нашел следующее решение:

  1. Для относительно небольших баз данных (<1,5Mb) </li>

Я создал базу данных с помощью браузера баз данных SQLite и поместил ее в папку «Активы».

Затем следующий код копирует базу данных на устройство, если ее там еще нет:

    boolean initialiseDatabase = (new File(DB_DESTINATION)).exists();

public void copyDB () выбрасывает IOException { final String DB_DESTINATION = "/data/data/happyworx.nl.Flitswoorden/databases/WoordData.db";

    // Check if the database exists before copying


    Log.d("Database exist", "" + initialiseDatabase);
    Log.d("Base Context", "" + getBaseContext());

    if (initialiseDatabase == false) {

        // Open the .db file in your assets directory
        InputStream is = getBaseContext().getAssets().open("WoordData.db");


        // Copy the database into the destination
        OutputStream os = new FileOutputStream(DB_DESTINATION);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0){
            os.write(buffer, 0, length);
        }
        os.flush();

        os.close();
        is.close();
    }}

В моем приложении часть базы данных настраивается пользователем.

Я вызываю код выше в onStart () с:

        try {
        copyDB();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

Итак, когда пользователь нажимает «сбросить базу данных до стандартной» (на экране настроек), я просто устанавливаю логическое значение initialiseDatabase на «ложь» и жду, когда пользователь вернется к основному действию. (таким образом вызывая onstart и копируя исходную базу данных).

Я пытался вызвать Activity.copyDB () из предпочтений. Java. Это аккуратнее, потому что не требуется, чтобы пользователь возвращался к основному действию для восстановления базы данных. Тем не менее, я получаю сообщение об ошибке из-за невозможности вызова статических ссылок на нестатические методы. Я не понимаю этого, но посмотрю на это.

0 голосов
/ 06 ноября 2011

Вы можете использовать bulkInsert:

   ContentValues[] cvArr = new ContentValues[rows.size()];
   int i = 0;
   for (MyObject row : rows) {
    ContentValues values = new ContentValues();
    values.put(KERN, myObject.getKern());
    values.put(WOORD, myObject.getWoord);       
    cvArr[i++] = values;
    }// end for
    resolver.bulkInsert(Tasks.CONTENT_URI, cvArr);
...