web-dev-qa-db-ja.com

Androidアプリの更新時にSharedPreferencesはどうなりますか?

アプリのSharedPreferencesにユーザー設定を保存しました。 Google Playストア経由でアプリを新しいバージョンに更新すると、SharedPreferencesはどうなりますか?

SharedPreferncesは更新後も引き続き存在しますか、それとも削除されますか?

これまでのところ、WebやStackoverflowで答えが見つかりませんでした(間違ったキーワードで検索できますか?)。

このプロセスを説明するリンクをいくつか教えていただけますか?

編集:一方、私は他の答えも見つけました: 更新/アンインストール時のSharedPreferencesの動作

Edit 2:この質問を初めて聞いたときからかなり時間が過ぎてから、最近、Android 6.0( API 23)自動バックアップ機能を使用して、 Google here で説明されているように、共有設定をsecureすることもできます。allowBackup="true"AndroidManifest.xmlに追加するだけですファイル。

80
Bruno Bieri

Cristian here によると、ユーザーが更新プログラムをインストールしても、アプリケーションデータは残ります。

ただし、以前のアプリの更新として検出するには、同じpackage nameを使用する必要があります。

EboMike in Warning Androidアプリの更新により、古いアプリのバージョンからデータが失われる可能性があるというユーザーですか? によると:

率直に言って、アップグレードによるデータの損失は受け入れられません。

編集

通常、SharedPreferences(および他のユーザーデータ)は更新プロセス中に保持されますが、「 unknown 」問題により、データが失われる可能性があり、私はそれがあなたのコントロールの外にあると思います。したがって、SharedPreferencesが保持されると単純に信じることができます( こちら を参照)。

したがって、アップグレードの進行中にユーザーのデータが消去されないようにするには、メインデータを外部ストレージ(SDカードまたは内部の非リムーバブルストレージなどのリムーバブルストレージメディアにすることができます)に保存する必要があります。または、少なくともユーザーがアップグレード前にデータをバックアップできるようにします。その後、(アップグレードされた)アプリの初回実行時に、外部ストレージにバックアップファイルがあるかどうかを確認します。

アプリのアップグレード時に何をする必要がありますか/どうすればよいですか?、これについての説明はありません。 Android SecurityApplication signingcopy protectionおよびその他のトピック。上記のフィールドでアプリの状態を変更すると、異なる結果が生じることを意味します。
たとえば、CHANGED COPY PROTECTION FROM ON to OFF OR OFF to ONの場合、アプリは更新されますが、すべての共有設定が失われ、ファイルアクセスが不可能になります...
あなたは、以前のアプリの更新として新しいアプリbeing consideredを引き起こす条件に注意する必要があります( 変更できないものを参照 )。

また、コードに注意する必要があります。データベースのデータが削除される可能性があります( SQLite がプリロードされたアプリの更新を参照)。

ただし、最終的には、注意すれば、次のように言うことができます:

更新プロセスはapkファイルのみを置換するため(たとえば、ドロウアブルなど)、実行時に生成されるデータベース、共有設定、その他のファイルは変更されません(おそらくこの場合、新しいアプリは以前のアプリのUIDと等しいUID)。

詳細については、次のページをご覧ください。

助けて!?市場でアプリケーションを更新すると、保存されているSharedPreferencesが削除されます。
マーケットコピー保護により、更新後にファイルアクセスが完全に中断されます
誰かがアプリの更新プロセスを説明できますか?

67
hasanghaforian

前回Google Playでアプリケーションを更新したとき、sharedPreferencesは影響を受けていないと思います。
私はそれらを使用して自動的にログインしましたが、更新後はログインしました。

5
Lazy Ninja

4時間以上デバッグした後、シリアル化することでモデルを文字列として保存していることがわかりました。シリアライズ可能なクラスには名前serialVersionUIDで一意のidがあり、これはデフォルトで実行時に設定され、idはclassの名前、インターフェイス、変数名によっても計算されます。モデルクラスを変更し、変数を追加してからアプリを更新しました。クラスが変更されて新しいserialVersionUIDが設定されたため、更新時に、文字列をデシリアライズしてモデルを作成できず、Java.io.InvalidClassExceptionが発生していました。

この問題を回避するには、serialVersionUIDを明示的に設定します

static final long serialVersionUID = 42L;
5
abhishek