![](/img/trans.png)
[英]How to determine if Android app version is pro or lite from an Activity in a Library Project?
[英]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.