升级时保持相同的SQLite数据库,从Lite到Pro版本升级Android应用程序

时间:2012-01-20 12:43:57

标签: android sqlite upgrade

首先,我做了一次搜索,无法找到问题的具体答案,所以这里有...

我正在编写我的第一个Android应用程序并计划拥有Lite版本(有限功能)和付费版本(完整功能)。

Lite和Pro版本将使用相同的SQLite数据库结构,如果用户以Lite版本开始并升级到Pro版本,我不希望它们丢失他们在Lite版本中创建的数据。

由于Lite和Pro版本(根据我的理解)必须在单独的软件包中以允许Android Market区分它们,Pro版本如何才能看到Lite数据库?

非常感谢您的回答。

3 个答案:

答案 0 :(得分:12)

我所做的并且它似乎适用于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的评论和答案,因为他提出了一个有效的观点,我不记得我在他的例子中做了什么。

答案 1 :(得分:2)

如果可能的话,您可能希望采用“解锁”方法而不是单独的付费应用。这样你就只能使用一个包。如果没有其他原因,您将避免数据库所有权问题。

使用相同的android:sharedUserId将是一个很好的方法,如果您的应用已经有一套。如果没有,如果您发送的确有一个更新,则您将无效访问所有用户的数据。如果你从方形零开始并且还没有用户希望保留他们的数据,那么从第一天开始就设置sharedUserId

答案 2 :(得分:1)

由于@Chris告诉你可以使用“解锁”方法,我会解释它在这种情况下的表现。

你可以拥有一个像'Features'这样的表应该有一个列/标志IsAvailable。如果要限制某些功能,可以将其IsAvailable标志设置为FALSE。

如果您对数据库结构进行了更改,则应使用以下命令升级数据库:

@Override
public void onUpgrade()
{
  if (condition == true)
    // alter table
}