2013-03-19 6 views
2

Я пытаюсь создать резервную копию & функции восстановления в моем приложении. До этого я читал на некоторое время, чтобы понять, если это возможно достичь, но я узнал, что этот вопрос: Sqlite DB Android Backup/RestoreЕсть ли способ извлечь запросы из SQLite?

Единственный способ, которым я мог бы видеть, чтобы сделать это, было бы прочитать фактическое содержимое БД и сгенерировать файл, содержащий SQL, с которого он может быть восстановлен, это, очевидно, более сложный и не дает никаких преимуществ, чтобы оправдать эту сложность.

Этот ответ, на мой взгляд, является наилучшим способом достижения этого; не разыскивая файл .db, а экспортируя запросы.

Знаете ли вы; при экспорте данных SQL из mysql вы получаете файл, содержащий все запросы, которые создают структуру и запросы, которые заполняют структуру данными.

Вот что я пытаюсь подражать; сгенерируйте файл, содержащий sql-запросы из файла .db.

Вы, ребята, думаете, что это возможно, я имею в виду, есть ли встроенный метод для достижения этого?

В противном случае, если его слишком сложно обрабатывать, как вам удается избежать того, о чем говорит этот пользователь (https://stackoverflow.com/a/10842043/1943607)?

Итак, я отключил WAL с помощью «PRAGMA journal_mode = DELETE», а затем я смог просмотреть базу данных в браузере и смог нормально ее восстановить на своем тестовом устройстве.

Эта предыдущая часть, я не могу ее понять. Это конфигурация, настроенная на sqlite?

Благодаря

+0

Вы читали ссылку? – Reinherd

+0

Не хочешь быть грубым, но я не должен оправдывать сложность.Как говорит пользователь в вопросе, который я связал ранее, просто копирование не является хорошим способом резервного копирования и восстановления, потому что sqlite может не читать db, даже если это одно и то же приложение и версия sqlite. Поэтому мы должны искать обходной путь, который будет экспортировать необработанные запросы. – Reinherd

ответ

1

Я на самом деле не пробовал это с SQLite, но с MySQL вы можете делать такие вещи, как создать «свалки» вашей базы данных. Эти дампы содержат именно то, что вы описываете: набор запросов, которые при выполнении вместе воссоздают базу данных, включая содержимое.

Судя по документации «sqlite3», указанной в http://www.sqlite.org/sqlite.html (особенно в разделе «Преобразование всей базы данных в текстовый файл ASCII»), вы можете сделать то же самое для sqlite. Поскольку вы можете выполнять команды оболочки из Java-приложения (используя методы Runtime.getRuntime(). Exec()), и вы являетесь «владельцем» (идентификатор пользователя Linux) базы данных, вы должны иметь возможность запускать этот «sqlite3». дамп "даже на ненагруженном устройстве. Я никогда не видел Android-устройство без установленного инструмента sqlite3, поэтому команда всегда должна быть доступна.

Кроме того, поскольку файл дампа представляет собой текстовый файл, вы должны иметь возможность добавлять любые PRAGMA к ним, которые необходимы для совместимости (например, тот, который вы цитировали).

Я не проверял ничего из этого, а просто хотел подумать с тобой по этой интересной теме.

+0

выглядит круто. Я проверю это сегодня. Обновит вас, если вы заинтересованы;) – Reinherd

+0

, пометив этот вопрос как «любимый» ;-) – baske

+0

У меня возникают проблемы при попытке выполнить sqlite3. 'Процесс p = Runtime.getRuntime(). Exec (new String [] {" sqlite3 "});' выбрасывает Exception' ExceptionError, выполняющий exec(). Команда: [sqlite3] Рабочий каталог: null Окружающая среда: null'. Есть идеи? – Reinherd

1

База данных sqlite - это всего лишь файл, поэтому вы можете скопировать файл, но я думаю, что у вас могут быть проблемы с разрешениями в android, которые препятствуют доступу к базе данных.

Лучшим решением для ИМО будет синхронизация ваших данных с внешним веб-сайтом. Использование комбинации пользовательского адаптера синхронизации и менеджера учетных записей с веб-сайтом или веб-сервисом, в котором RESTfull api для приема и отправки синхронизированных данных будет самым надежным подходом.

http://developer.android.com/training/id-auth/identify.html - отличное введение в настройку менеджера аккаунта.

И для пользовательского адаптера синхронизации это отличная отправная точка. http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/ и http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-2/

И, наконец, объяснение того, как все это совмещается https://sites.google.com/site/andsamples/concept-of-syncadapter-androidcontentabstractthreadedsyncadapter Описанный выше подход позволит пользователю переключать телефоны и сохранять данные в то же время и данные всегда будут в актуальном состоянии (при условии, вы должны синхронизировать в соответствующее время.

Кажется, что вам очень нужна работа, так как вам нужно будет настроить веб-службу, но это ЛУЧШИЙ способ убедиться, что данные сохранены в безопасности и могут быть восстановлены и скопированы в любой точке.

Для веб-службы доступно множество вариантов, включая облачные сервисы, такие как документы Google или создание собственного веб-сайта. Ruby on Rails - отличное решение для разработки вашего собственного сайта, поскольку вы получаете полный RESTfull api из коробки, и он мертв, легко защищает/блокирует сайт рельсов авторизованным пользователям только с помощью нескольких строк кода и с Heroku вы можете получить бесплатный хостинг.

Как обычно, при разработке Android простейшие требования на самом деле становятся самыми сложными в реализации, но там, где безопасность данных имеет первостепенное значение, стоит потратить на это должное внимание.

+0

Я не уверен, что это лучший способ добиться этого. Другой ответ выглядит «проще». Еще не пробовал, но я проверю это как можно скорее. Я не думаю, что мы должны построить эту огромную систему для управления простым приложением базы данных. Возможно, просто извлечение запросов и создание кода целостности должны сделать трюк. – Reinherd

+0

@ SergiCastellsaguéMillán Я согласен, что это сложное решение, но оно безопасно, гибко и доступно. Вы не указали, почему вам нужно создавать резервные копии и восстанавливать свои данные, поэтому я не могу предложить суждение о том, что является лучшим вариантом для вас, так как это рекомендуемый шаблон дизайна для Android для выполнения чего-то подобного. Возможно, это перебор. Только вы можете судить :) – jamesc

0

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

Положительным проекта со стороны SQLite является открытым исходным кодом и формат файла БД задается Here

После взглянуть там, кажется, очень возможно/не слишком сложно для разбора любой файл БД ищет Только данные и запишите его в другой функциональный файл db.

Я считаю, что это самое быстрое и чистое решение проблемы.

так, чтобы обернуть:

  • Скопируйте файл БД каждый раз, когда вы хотите его резервную копию.
  • Если вы хотите восстановить создание новой базы данных с помощью API Android.
  • Разберите данные из резервной копии и запишите их во вновь созданный БД.

P.S: о том, как использовать

PRAGMA journal_mode = УДАЛИТЬ

Просто используйте db.exec("PRAGMA journal_mode = DELETE"); при создании БД

Смежные вопросы