Защита кэша карт от очистки –
решение проблемы оффлайн-карты в iOS 5

В iOS 5 изменился формат MapTiles.sqlitedb – базы данных, в которой хранится кэш карты. Чтобы перекодировать базу данных в новый формат, старые конвертеры не годятся, а новых в интернете нет. Поэтому затея с изготовлением оффлайн-карты для iOS 5 бессмысленна.
Заранее нужный кэш изготовить не получится, и по достижении размера примерно 20 Mb старые тайлы карты будут затираться новыми.

Nick Adams предлагает решение, как кэш карт защитить от стирания. Это не решает проблему с изготовлением нужной карты заранее, зато позволяет сэкономить трафик при просмотре уже кэшированной ранее области карты.
В базе данных создаётся триггер (переключатель), суть работы которого состоит в том, чтобы обнулить выборку строк базы данных, предназначенных для удаления. То есть приложение „Карты“ будет, как всегда, выполнять транзакцию по удалению старых строчек, но по ходу дела выборка окажется нулевой, и из базы ничего не удалится.

Чтобы выполнить эту хитрую операцию, нужно выгрузить из телефона кэш карты, который хранится там по адресу:
/var/mobile/Library/Caches/Maps/MapTiles/MapTiles.sqlitedb
можно воспользоваться DiskAid или другим файловым менеджером, который умеет подсоединяться к айфону.
После этого следует открыть файл базы данных в каком-нибудь приложении, поддерживающем формат SQLite. Я воспользовался SQLite Manager (есть и для Windows, и для OS X).

Здесь создаём новый триггер, который защитит базу данных кэша карт от затирания:
CREATE TRIGGER prevent_delete BEFORE DELETE ON image
BEGIN SELECT raise(IGNORE);
END


Для этого открываем раздел “Triggers” и создаём новый переключатель, щёлкая по плюсику внизу окна:


Создание триггера, запрещающего стирание базы данных, в SQLiteManager

Заполняем поля согласно форме SQL-выражения, и новый триггер готов.
Теперь нужно убедиться, что приложение „Карты“ на айфоне не открыто и не находится в списке фоновых задач, и заменить старый файл MapTiles.sqlitedb новым файлом с созданным триггером.
Всё готово, теперь просматриваемые фрагменты карты не удаляются:


Размер файла базы данных кэша карт iOS

Если у вас нет уверенности в правильности своих действий, можно начать с этого файла: MapTiles.sqlitedb (SQLite, 33 Kb)
или же скачать файл кэша с картой Санкт-Петербурга: MapTiles.sqlitedb.zip (ZIP-архив, 469 Mb, iPhone 4/4S).

P.S. Естественно, подразумевается, что у вас iPhone/iPad был подвергнут джейлбрейку.
P.P.S. Можно пользоваться отличной функцией бесплатных Яндекс.Карт – загрузкой оффлайн-карты, но это работает только для некоторых российских городов, да и не всегда карты в Яндексе лучше.


Подпись к карте

Защита кэша карт от очистки - решение проблемы оффлайн-карты в iOS 5: 4 комментария

Добавить комментарий