2012-09-28 105 views
59

我已將用戶設置存儲在我的應用程序的SharedPreferences中。當我通過Google Play Store更新應用程序到新版本的應用程序時,SharedPreferences會發生什麼?更新Android應用程序時SharedPreferences會發生什麼?

更新後SharedPrefernces仍然存在或將被刪除?

到目前爲止,我還沒有在網絡上找到答案或Stackoverflow(我可以用錯誤的關鍵字搜索?)。

你能指點我一些他們描述這個過程的鏈接嗎?

編輯: 同時我發現對方的回答太:SharedPreferences behaviour on Update/Uninstall

編輯2: 由於時間過去頗有幾分當我第一次問這個問題,筆者近日瞭解到,由於Android 6.0(API 23 )也可以使用自動備份功能安全您的共享首選項,如Google here所述。只需在您的AndroidManifest.xml文件中添加allowBackup="true"即可。

回答

57

Cristian here說:您的應用程序數據將在用戶安裝更新時保留。

但它必須與package name一樣檢測爲以前的應用程序的更新。

EboMike在Warning Android user that app update could lead to losing data from old app version?說:

坦率地說,數據丟失是由於升級是不可接受的。

編輯

通常,所述SharedPreferences(以及其它用戶數據)將在更新過程中被保持,但有時,由於一些「未知」的問題,該數據可能會丟失,我想它已經超出了你的控制範圍。所以,你可以簡單地相信SharedPreferences將被保留(see here)。

因此,如果您希望避免在升級過程中清除用戶數據,則必須將主數據保存在外部存儲器中(可以是可移動存儲介質,如SD卡或內部不可移動存儲器),而不是專用於您的App.Or,至少在升級之前放棄用戶備份數據。然後,在第一次運行(已升級)的應用程序時,檢查是否有任何外部存儲中的備份文件或不存在。

如果你想知道什麼事情必須/可以發生在升級一個應用程序?,我對此沒有任何好的描述。它與Android Security,Application signing,copy protection和其他topics.I的意思是,如果你改變你的應用程序的狀態在任何上述領域是複雜和相對的,它會導致不同的結果。
例如,如果你CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ON,你的應用程序將被更新,但會導致你所有的共享首選項丟失,文件訪問是不可能的,...。
你雖然必須在條件關心導致您的新應用程序being considered作爲以前的應用程序的更新(見Things That Cannot Change)。

此外,您必須謹慎處理您的代碼,這可能會導致刪除數據庫的數據(請參閱update app with preloaded SQLite)。

但最終,如果要小心,你可以說:

更新過程只替換apk文件(因此它是什麼的 例如繪圖資源,...),不更改數據庫,共享首選項 和運行時生成的任何其他文件(可能在此 的情況下,新應用程序安裝的UID等於UID 以前的應用程序)。

你可以看到這些網頁瞭解詳情:

Help!? Updating our applicatoin on the market deletes the saved SharedPreferences.
Market copy protection totally breaks file access after updating
Can someone explain the App update process?

+0

謝謝,在我看來SharedPreferences應該保持良好狀態。但是這個過程沒有官方描述嗎? –

+0

@viperbone哪個進程?clareing sharedpreferences?或升級應用程序? – hasanghaforian

+0

升級應用程序進程。升級應用程序必須/可能發生什麼事情。 –

4

我認爲當我上次通過Google Play更新我的應用程序時,sharedPreferences不受影響。
我正在使用它們來自動登錄,並在更新後它這樣做。
這是一個月前,我的記憶可能會變得模糊,所以最好聽到其他人的意見。

4

調試超過4小時後,我發現,我被其序列保存模型作爲字符串。可序列化的類具有唯一的名稱 serialVersionUID,它在運行時默認設置,id也由類名,接口名和變量名計算。我發現我改變了模型類,添加了一個變量,然後更新了應用程序。由於該類現在改變這樣一個新的的serialVersionUID設置,因此在更新後,它不能反序列化的字符串,並創建模型,並給予java.io.InvalidClassException

明確設置的serialVersionUID以避免這種問題

static final long serialVersionUID = 42L; 
相關問題