簡體   English   中英

升級時保持相同的SQLite數據庫,從Lite到Pro版本升級Android應用程序

[英]Keeping the same SQLite database when upgrading and Android app from Lite to Pro version

首先,我做了一個搜索,找不到我的問題的具體答案,所以這里...

我正在編寫我的第一個Android應用程序,並計划擁有Lite版本(有限功能)和付費版本(完整功能)。

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的評論和答案,因為他提出了一個有效的觀點,我不記得我在他的例子中做了什么。

如果可能的話,您可能希望采用“解鎖”方法而不是單獨的付費應用。 這樣你就只能使用一個包。 如果沒有其他原因,您將避免數據庫所有權問題。

如果你的應用已經android:sharedUserId使用相同的android:sharedUserId將是一個很好的方法。 如果沒有,如果您發送的確有一個更新,則您將無效訪問所有用戶的數據。 如果你從方形零開始並且還沒有用戶期望保留其數據的應用程序,那么肯定從第一天開始設置sharedUserId

正如@Chris告訴你可以使用“解鎖”方法,我將解釋它在這種情況下的表現。

你可以有一個像'Features'這樣的表應該有一個列/標志IsAvailable。 如果要限制某些功能,可以將其IsAvailable標志設置為FALSE。

如果您對數據庫結構進行了更改,則應使用以下命令升級數據庫:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM