Как использовать sqlite VACUUM в android

У меня есть приложение для Android, которое включает в себя вход в приложение и выполняет множество операций CRUD. Когда пользователь входит в систему в первый раз, он / она быстро регистрирует его / ее, есть ли какие-либо данные, доступные для этого пользователя, которые будут загружены. Но позже, когда вы снова войдете в систему, процесс будет очень медленным, иногда он занимает от 20 до 30 минут. Итак, я прочитал об использовании VACUUM, чтобы избежать образования свободного места при удалении записи.

Я немного смущен, когда и как использовать VACUUM, это при открытии базы данных, когда пользователь входит в систему? или в другой раз.

Любые предложения по этому поводу были бы полезны. Спасибо

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
1 656
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

От: 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% безопасна, поэтому сначала предложите резервный.

Спасибо за ответ. Итак, когда я выполняю эту команду, для ее выполнения требуется некоторое время. Итак, возможно ли, что я выберу опцию и разрешаю пользователю запускаться, но приложение тормозит.

priya 18.12.2018 20:05
это займет некоторое время, чтобы завершить не всегда. Это зависит от размера и фрагментации db. Да, вы можете указать пункт меню, который пользователь может щелкнуть и выполнить эту операцию. Вы можете выполнить эту операцию в асинтаксической задаче, чтобы отображать индикатор выполнения на время выполнения операции.
forpas 18.12.2018 20:09

Замечательно. Спасибо за ваше предложение. У меня есть еще одно сомнение, как будто в соответствии с документом он создает временный файл базы данных, а затем перезаписывает исходный файл базы данных. Так что мне нужно создать этот временный файл базы данных или дать ссылку на исходный файл базы данных. 2. Перед выполнением этой операции мне нужно открыть базу данных, а не начинать транзакцию, такую ​​как добавление или удаление данных?

priya 18.12.2018 20:15

Вам не нужно создавать какие-либо временные базы данных. Если таковые имеются, о них позаботится движок sqlite. Перед выполнением этой операции вам необходимо получить действительный объект SQLiteOpenHelper, например db, чтобы использовать его для метода execSql(), точно так же, как вам нужен такой объект для операций CRUD. Конечно, пока операция активна, не следует пытаться выполнять какие-либо другие операции. После того, как он будет закончен, лучше (я думаю) закрыть и повторно получить объект db (я не нашел это задокументированным). Конечно, всегда сначала резервное копирование.

forpas 18.12.2018 20:21

Здорово!; Я добавил: db.execSQL ("VACUUM") внутри функции удаления, никаких ошибок нет, теперь мне любопытно узнать, как узнать, "пылесосится" ли моя база данных, перезапускается ли первичный ключ ID снова в 1?

MarkT 19.02.2021 22:50

Единственное, что упоминается в документации, которую вы можете найти здесь: sqlite.org/lang_vacuum.html: «Команда VACUUM может изменять ROWID записей в любых таблицах, не имеющих явного INTEGER PRIMARY KEY». Итак, нет, если вы определили идентификатор как INTEGER PRIMARY KEY AUTOINCREMENT, новый идентификатор будет начинаться с последнего идентификатора, когда-либо введенного в таблицу +1.

forpas 19.02.2021 23:10

Другие вопросы по теме