Инкрементальный ключ сброса комнаты после удаления данных - PullRequest
0 голосов
/ 04 июля 2019

Как я могу установить идентификатор (который является моим @PrimaryKey(autogenerate = true)) обратно в 0 после того, как я удалил все данные в Таблице базы данных комнаты?На данный момент мое удаление работает, но новый инкремент вставленных данных, где был последний идентификатор.

1 Ответ

3 голосов
/ 04 июля 2019
@Dao
interface MyDao {

 @RawQuery
 fun vacuumDb(supportSQLiteQuery: SupportSQLiteQuery): Int
}

Когда все содержимое будет удалено, выполните эту инструкцию:

MyDao.vacuumDb(SimpleSQLiteQuery("VACUUM"))

Команда VACUUM не изменяет содержимое вашей базы данных, но меняет rowids .Это сбросит rowids .

Как работает VACUUM?

Команда VACUUM работает, копируя содержимое базы данных во временный файл базы данных, а затем перезаписываяоригинал с содержимым временного файла.При перезаписи оригинала используется журнал отката или WAL-файл с опережением записи, как и для любой другой транзакции базы данных.Это означает, что при VACUUMing базе данных в свободном дисковом пространстве требуется вдвое больше размера исходного файла базы данных.

Команда VACUUM INTO работает так же, за исключением того, что она использует файл, названный в INTOвместо временной базы данных и пропускает шаг копирования вакуумной базы данных поверх исходной базы данных.

Команда VACUUM может изменить ROWID записей в любых таблицах, которые не имеют явного INTEGER PRIMARYКЛЮЧ.

VACUUM завершится ошибкой, если в соединении с базой данных есть открытая транзакция, которая пытается запустить VACUUM.Незаконченные операторы SQL обычно удерживают открытую транзакцию чтения, поэтому VACUUM может завершиться ошибкой, если в одном соединении есть незавершенные операторы SQL.VACUUM (но не VACUUM INTO) является операцией записи, поэтому, если другое соединение с базой данных удерживает блокировку, предотвращающую запись, то VACUUM завершится ошибкой.

Альтернатива использованию команды VACUUM для восстановления пространства после того, как данные имеютбыл удален режим автоматического вакуума, включенный с помощью прагмы auto_vacuum.Когда auto_vacuum включен для базы данных, свободные страницы могут быть восстановлены после удаления данных, что приведет к сжатию файла без перестройки всей базы данных с использованием VACUUM.Однако использование auto_vacuum может привести к дополнительной фрагментации файла базы данных.И auto_vacuum не сжимает частично заполненные страницы базы данных, как VACUUM.

Дополнительная информация: SQLite VACUUM

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