Комментарии 5
Спасибо за статью! Не пользуюсь SQLite, но про внутренности БД всегда интересно читать)
Пример заголовока файла в HEX-редакторе
Что-то как-то баланс не сошёлся. Если учитывать, что
Число страниц в базе. Умноженное на размер страницы должно совпадать с размером файла на диске.
то страницы нумеруются с единицы. Если всего в БД 77 страниц, а из них свободных 74, то занятых - вероятно, три, причём одна из них - та, что самая первая. Но если первая свободная страница - номер 6, то занятых получается как минимум первые пять.
Где, в чём ошибка? что приводит к такому несоответствию?
Akina, спасибо, что заметили. Надо было уточнить, что это номер первой корневой страницы и разумеется она может быть не первой. Я могу предположить, что это первая свободная страница, которая освободилась при удалении данных. В данном случае: у таблицы одна корневая свободная страница №6, куча листьев, прикрепленных к ней, начиная с №2 (итого 74), sqlite_master на 1-ой странице, одна обычная таблица на №76 (один лист) и для её индекса по первичному ключу на №77. Последние два номера можно получить из sqlite_master.
P.S. Промахнулся и возможности перенести нет.
Так, я правильно понимаю, что если у меня, предположим айфон, в котором сафари хранит всю историю в history.db, и я например ее салучайно потер из гуя приложения, т.е техничкси транкейтнул таблицу, то выгрузив history.db файл наружу (представим, что у меня джейлбрейк) и прогнав по нему вашей утилитой, он теоретически может ресторнуть транкейтнутые филды?
Восстановление удаленных строк в SQLite