правильный расчет размера базы данных Sqlite

#android #sqlite #android-sqlite

#Android #sqlite #android-sqlite

Вопрос:

У меня есть приложение, которое требует записи многих строк в базу данных Sqlite. Во время тестирования я заметил, что выдается фатальная ошибка исключения: «Не удалось выделить окно курсора из-за размера базы данных, всегда какое-то число больше 2000000«, как показано по ссылке ниже, поскольку размер объекта базы данных Sqlite увеличивается до более чем 2 мегабайт.

CursorWindow не может быть выделен из-за размера базы данных более 2000000 байт Исключение всегда генерируется при cursor.moveToFirst() в приведенном ниже методе:

 public boolean doesBusinessExist(Business_4s business)
{
    //
    boolean businessExists = false;
    //

    if(business != null) {

        //
        String query = "Select "   COLUMN_ID   " FROM "   TABLE_BUSINESS   " WHERE "   COLUMN_ID   " =  ""   business.get_id()   """;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query, null);
        //

        try {
            //
            if (cursor != null amp;amp; cursor.moveToFirst()) {
                cursor.moveToFirst();

                //want to know how many business are there
                int cnt = cursor.getCount();

                //return true
                if (cnt > 0) {
                    businessExists = true;
                }

            } else {
                businessExists = false;
            }
            //
        } finally {
            cursor.close();
            db.close();
        }
    }

    //
    //final return
    return businessExists;
    //

}
  

Итак, я решил написать некоторый код, чтобы не добавлять больше данных, когда размер базы данных близок к 2 мегабайтам, снова провел исследование о том, как рассчитать размер базы данных sqlite и нашел два способа сделать это:

метод1:

     File f = getDatabasePath("businessDB.db");
    long dbSize = f.length();
  

Значение dbSize в этом методе равно: 53248 байт

метод2:

     dbHandler = new MyDBHandler_bus_4s(getApplicationContext(),null);
    SQLiteDatabase db_ =  dbHandler.getWritableDatabase();
    long size = new File(db_.getPath()).length();
  

значение размера в этом методе равно: 53248 байт

Учитывая, что размер базы данных рассчитывается как 53248 байт, чего-то не хватает в моих расчетах, поскольку я уверен, что размер базы данных на данный момент близок к 2000000 байт, так каков правильный способ вычисления размера базы данных Sqlite в Android?

Комментарии:

1. Я не очень много знаю об Android, но основной файл базы данных — не единственный файл, используемый SQLite, я думаю, вам также нужно учитывать различные временные файлы

2. Спасибо, но я не уверен, как это решает проблему.

3. SQLite записывает данные в журнал, и в зависимости от прагм, до тех пор, пока транзакция не будет зафиксирована, данные, возможно, не были записаны в основной файл базы данных, поэтому общее использование может превышать этот размер файла. Могу ли я спросить, почему вы не просто пишете запрос count изначально, но используете курсор?

4. Вы дали мне подсказку, упомянув «общий размер», я провел некоторое расследование, и, похоже, вы правы, я собираюсь ответить на свой вопрос

Ответ №1:

Для будущих путешественников:

По моим наблюдениям, общий размер всех баз данных SQLite для определенного пакета не может превышать 2 МБ (по крайней мере, по умолчанию). В моем приложении было 5 баз данных SQLite, и со временем общий размер этих баз данных, как правило, превышал 2 МБ. Реализованный обходной путь заключался в настройке службы очистки с использованием Alarm Manger для регулярного поддержания количества записей в базах данных.

Как я узнал? Установил это приложение на рутированный телефон и перешел к локальному>Устройство> данные> данные>[название пакета приложения]> базы данных

Также для каждой базы данных существует другой файл с расширением .db-journal, который обычно имеет меньший размер, чем фактическая база данных, но также занимает некоторое место.

Дополнительное изображение

Комментарии:

1. Вы не неправильно интерпретируете ошибку? Сбой происходит не потому, что размер базы данных > 2 МБ (что совсем немного), а потому, что окно курсора слишком большое.