У меня есть приложение для Android, которое включает в себя вход в приложение и выполняет множество операций CRUD. Когда пользователь входит в систему в первый раз, он / она быстро регистрирует его / ее, есть ли какие-либо данные, доступные для этого пользователя, которые будут загружены. Но позже, когда вы снова войдете в систему, процесс будет очень медленным, иногда он занимает от 20 до 30 минут. Итак, я прочитал об использовании VACUUM, чтобы избежать образования свободного места при удалении записи.
Я немного смущен, когда и как использовать VACUUM, это при открытии базы данных, когда пользователь входит в систему? или в другой раз.
Любые предложения по этому поводу были бы полезны. Спасибо
От: https://sqlite.org/lang_vacuum.html
Running VACUUM ensures that each table and index is largely stored contiguously
within the database file
Насчет многие операции CRUD: файл db обычно становится фрагментированным, особенно
когда эти операции включают, скажем, удаление большого количества данных.
С кодом Java это довольно просто:
db.execSQL("VACUUM");
хотя этот процесс может занять некоторое время, и его невозможно отслеживать.
Конечно вам не нужно выполнять этот оператор каждый раз, когда вы запускаете приложение, но периодически.
Или вы можете позволить пользователю выполнить этот процесс, если он / она испытывает задержки при загрузке данных или даже при входе в систему после того, как вы дадите понять, что такая операция, как и любая операция восстановления, не на 100% безопасна, поэтому сначала предложите резервный.
Замечательно. Спасибо за ваше предложение. У меня есть еще одно сомнение, как будто в соответствии с документом он создает временный файл базы данных, а затем перезаписывает исходный файл базы данных. Так что мне нужно создать этот временный файл базы данных или дать ссылку на исходный файл базы данных. 2. Перед выполнением этой операции мне нужно открыть базу данных, а не начинать транзакцию, такую как добавление или удаление данных?
Вам не нужно создавать какие-либо временные базы данных. Если таковые имеются, о них позаботится движок sqlite. Перед выполнением этой операции вам необходимо получить действительный объект SQLiteOpenHelper
, например db
, чтобы использовать его для метода execSql()
, точно так же, как вам нужен такой объект для операций CRUD. Конечно, пока операция активна, не следует пытаться выполнять какие-либо другие операции. После того, как он будет закончен, лучше (я думаю) закрыть и повторно получить объект db
(я не нашел это задокументированным). Конечно, всегда сначала резервное копирование.
Здорово!; Я добавил: db.execSQL ("VACUUM") внутри функции удаления, никаких ошибок нет, теперь мне любопытно узнать, как узнать, "пылесосится" ли моя база данных, перезапускается ли первичный ключ ID снова в 1?
Единственное, что упоминается в документации, которую вы можете найти здесь: sqlite.org/lang_vacuum.html: «Команда VACUUM может изменять ROWID записей в любых таблицах, не имеющих явного INTEGER PRIMARY KEY». Итак, нет, если вы определили идентификатор как INTEGER PRIMARY KEY AUTOINCREMENT
, новый идентификатор будет начинаться с последнего идентификатора, когда-либо введенного в таблицу +1.
Спасибо за ответ. Итак, когда я выполняю эту команду, для ее выполнения требуется некоторое время. Итак, возможно ли, что я выберу опцию и разрешаю пользователю запускаться, но приложение тормозит.