#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 МБ (что совсем немного), а потому, что окно курсора слишком большое.