加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

升级时保持相同的SQLite数据库,并将Android应用从Lite版本保留到

发布时间:2020-12-12 19:11:11 所属栏目:百科 来源:网络整理
导读:首先我做了一个搜索,找不到我的问题的具体答案,所以这里… 我正在撰写我的第一个Android应用程序,并计划拥有一个精简版本(有限功能)和一个付费版本(全部功能). Lite和Pro版本将使用相同的SQLite数据库结构,如果用户以Lite版本启动并升级到Pro版本,我不希望他
首先我做了一个搜索,找不到我的问题的具体答案,所以这里…

我正在撰写我的第一个Android应用程序,并计划拥有一个精简版本(有限功能)和一个付费版本(全部功能).

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

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

非常感谢您的答案.

我做了什么,似乎对于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">

然后代码复制DB …

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的评论和答案,因为他提出了一个有效的点,我不记得我在他的例子中做了什么.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读