Установка базы данных Android sqlite слишком медленная при открытии БД.Как решить? - PullRequest
3 голосов
/ 08 марта 2011

Я использую следующий метод для чтения / записи БД:

  1. База данных находится по адресу /data/data/ndompackagename отпуска/databases/Database.db. Поскольку размер базы данных превышает 3 МБ, мы нашли специальное решение, чтобы скопировать ее туда и заполнить соответствующими данными.

  2. Ниже приведен класс, реализующий задачу для получения открытой базы данных. Этот класс-одиночка.

    public class DatabaseHelper extends SQLiteOpenHelper
    
  3. для открытия базы данных мы используем следующий метод:

    SQLiteDatabase db = DatabaseHelper.getInsance().getReadableDatabase();
    
  4. Тогда rawquery используется для запроса БД:

    Cursor cursor = db.rawQuery(query, null);
    
  5. Затем, наиболее подходящие для наших целей, мы извлекаем данные базы данных в память в различных экземплярах набора результатов:

    while (cursor.moveToNext()) {
        ResultSet rs = new ResultSet();
        rs.setThis(cursor.getInt(0));
        rs.setThat(cursor.getString(1));
        // and so on.. this is just an example
        ResultList.add(rs);
    }
    
  6. Наконец:

    cursor.close();
    db.close();
    
  7. При необходимости отметим, что транзакция также используется, но использование транзакции не привело к ускорению.

Для каждого отдельного запроса (вполне) соблюдается приведенный выше шаблон. Но, к сожалению, это решение кажется очень медленным. Итак, некоторые методы профилирования сделаны, и стало ясно, что sqlite setlocale всегда запускается на getReadableDatabase() (который создан! Не забудьте), и этот метод занимает большую часть времени. В среднем 40% в одиночку ..

Посоветуйте, пожалуйста, как решить эту проблему! Или, может быть, предложите другой шаблон для удовлетворения наших потребностей!

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 18 апреля 2012

6) Наконец:

cursor.close();
db.close();

Невозможно сохранить базу данных открытой между запросами?

0 голосов
/ 19 марта 2014

Как и в случае с заданным здесь вопросом ( SQLCipher для Android getReadableDatabase () Overherad ), проблема с производительностью, вероятно, возникает из-за получения ключа SQLCipher.Производительность открытия базы данных намеренно низкая из-за деривации ключа.Вам следует кэшировать соединение с базой данных, чтобы его можно было использовать несколько раз, не открывая и не вводя базу данных повторно.Если это возможно, предпочтительнее открыть базу данных один раз во время запуска.Последующий доступ к одному и тому же дескриптору базы данных не приведет к деривации ключа, поэтому производительность будет намного выше.

0 голосов
/ 25 марта 2011

Szia!

Самое смешное, native_setLocale (который вызывает медленное открытие БД), по-видимому, даже не работает: http://code.google.com/p/android/issues/detail?id=2625

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