Почему мне нужно закрыть БД после того, как я установил this.getReadableDatabase ()? - PullRequest
0 голосов
/ 02 июня 2019

У меня та же проблема, что и у пользователя по ссылке ниже. Он упомянул, что пустая база данных создается только на определенном устройстве Android (для меня это пиксель, для него другой телефон Android). Тем не менее, на большинстве телефонов Android поведение в настоящее время в коде работает.

Выложено решение, в котором кто-то упоминает о добавлении db.close() после this.getReadableDatabase() для решения проблемы. Тем не менее, я не уверен, почему это исправить и почему поведение работает только на определенных устройствах Android?

Вот ссылка: http://www.anddev.org/networking-database-problems-f29/missing-table-in-sqlite-with-specific-version-of-desire-hd-t50364.html

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Короче говоря, вам не нужно, ЕСЛИ вы используете правильную технику, НО, если вы используете исторически часто используемый метод, как показано ниже, то вам нужно, потому что: -

Причина, по которой this.getReadableDatabase()/ используется для создания папки базы данных / каталога в каталоге data / data / the_package /.Если каталог базы данных не существует, типичная копия из ресурсов завершается с ошибкой ENOENT.

С SQLite, использующим ведение журнала в режиме журнала по умолчанию, это не проблема, поэтому исторически сложилось так, что обход использования this.getReadableDatabase() сработало.

Однако в Android Pie (28) SDK был изменен для использования записи по расписанию (WAL) по умолчанию, которая является более поздней и более продвинутой.метод ведения журнала.Этот метод использует два файла с улучшенными мерами безопасности.Один из них заключается в том, что файлы помечены / помечены как принадлежащие базе данных, которая их создала.

Поэтому, когда база данных копируется с использованием старого метода без закрытия двух файлов (файл базы данных с суффиксом -wal и -shm) существует и, скорее всего, будет содержать данные журналов (например, создание любых таблиц).Однако они не будут помечены как скопированные для базы данных, поэтому (я полагаю) база данных воссоздается (поскольку скопированная база данных не может быть открыта из-за несоответствия между базой данных и файлами -shm и -wal) и, следовательно,следующая таблица не найдена ошибка, которая обычно встречается.

При закрытии WAL базы данных / соединения происходит фиксация данных и, следовательно, зачем закрывать базу данных после (немедленно) работы this.getReadableDatabase().

Однако правильное исправление состоит в том, чтобы проверить и создать каталог баз данных, если он не существует, используя методы File.Тогда нет необходимости открывать базу данных, которая тратит впустую ресурсы, а также нет необходимости закрывать базу данных, которая также бесполезна для ресурсов (т.е. фактически выполняются зарегистрированные действия и данные записываются на диск и -wal и-shm файлы также читаются и переписываются).

0 голосов
/ 02 июня 2019

Я думаю, что эта проблема связана с тем фактом, что каждый выпуск Android имеет свою версию SQLite, и некоторые поставщики также настраивают версию библиотеки SQLite. Как вы можете прочитать по этой ссылке :

Android API SQLite Version
API 27  3.19
API 26  3.18
API 24  3.9
API 21  3.8
API 11  3.7
API 8   3.6
API 3   3.5
API 1   3.4

Надеюсь, это поможет.

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