Сохранение одной базы данных SQLite при обновлении и Android-приложения с версии Lite до Pro - PullRequest
14 голосов
/ 20 января 2012

Прежде всего я выполнил поиск и не могу найти конкретный ответ на свой вопрос, так что вот так ...

Я пишу свое первое приложение для Android и планирую иметь облегченную версию (ограниченные функции) и платную версию (полные функции).

Версия Lite и Pro будет использовать одну и ту же структуру базы данных SQLite, и если пользователь начинает с версии Lite и обновляет ее до версии Pro, я не хочу, чтобы они потеряли данные, созданные в версии Lite.

Поскольку версии Lite и Pro (насколько я понимаю) должны быть в отдельных пакетах, чтобы позволить Android Market различать их, как версия Pro может видеть базу данных Lite?

Заранее большое спасибо за ваши ответы.

Ответы [ 3 ]

12 голосов
/ 20 января 2012

То, что я сделал и, похоже, работает для Hexaddicus, - это запуск версий Lite и Pro от одного пользователя, а затем при первом запуске версии Pro скопируйте базу данных Lite.Затем сообщите пользователю копии.

Установите одинаковые значения android:sharedUserId в обоих продуктах ...

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mycompany.package"
      android:sharedUserId="com.mycompany.package" <---- IMPORTANT
      android:versionCode="10"
      android:versionName="@string/app_version"
      android:installLocation="auto">

А затем код для копирования БД ...

    try {
        final Context free_context = this.createPackageContext("com.mycompany.package", Context.CONTEXT_INCLUDE_CODE);
        final File    full_db      = this.getDatabasePath(GameData.DATABASE_NAME);
        final File    full_db_dir  = full_db.getParentFile();
        final File    free_db      = free_context.getDatabasePath(GameData.DATABASE_NAME);
        final File    free_db_dir  = free_db.getParentFile();

        if (free_db.exists() == false)     return;
        if (full_db_dir.exists() == false) full_db_dir.mkdir();
        if (full_db.exists() == false)     full_db.createNewFile();

        FileUtils.copyDirectory(free_db_dir, full_db_dir);
        this.gameData.getWritableDatabase();
    }
    catch (NameNotFoundException e) {
        /* do nothing here since this is an semi expected case */
        Log.w("mytag", "No Lite version found");
    } catch (IOException e) {
        Log.w("mytag", "Failed to create file");
    }
}

Единственным недостатком является то, что после завершения копирования синхронизация между двумя версиями отсутствует.Вы также должны убедиться, что пользователь версии Lite работает под версией sharedUserId, иначе копирование не удастся.

Обновление: пожалуйста, примите во внимание комментарии и ответы ChrisCashwells, так какон выдвигает правильную точку зрения, и я не могу вспомнить, что я сделал в его примере.

2 голосов
/ 20 января 2012

Возможно, вы захотите сделать больше «разблокировки», чем отдельное платное приложение, если это возможно. Таким образом, вы используете только один пакет. Если по какой-либо другой причине вы избежите вопроса о владении базой данных.

Использование того же android:sharedUserId было бы хорошим подходом , если в вашем приложении уже есть один набор. Если нет, то вы лишите законной силы доступ ко всем данным ваших пользователей, если отправите обновление с одним набором. Если вы начинаете с нуля и у вас еще нет приложения в дикой природе, когда пользователи ожидают сохранить свои данные, обязательно установите sharedUserId с первого дня.

1 голос
/ 20 января 2012

Поскольку @Chris сказал, что вы можете использовать подход "разблокировки", я объясню, как я поступаю в таких условиях.

У вас может быть таблица типа «Функции», в которой должен быть столбец / флаг IsAvailable. Если вы хотите ограничить определенные функции, вы можете установить для его флага IsAvailable значение FALSE.

Если у вас есть изменения в структуре БД, то вы должны обновить БД, используя:

@Override
public void onUpgrade()
{
  if (condition == true)
    // alter table
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...