2012-12-29 14 views
9

たとえば、いくつかの設定項目が追加または削除された場合、新しい設定構造でアプリケーションが更新されると、Androidは既存の設定データをどのように処理しますか?新しいバージョンの設定構造が変更された場合、Androidのユーザー設定の既存のデータはどうなりますか?

この基本的な質問は申し訳ありませんが、私の勤勉な検索と読解は答えを見つけることができませんでした。

+0

あなたが望むならば、あなたはDDMSからprefs XMLファイルを取り出して自分自身を探すことができます – mango

答えて

6

共有設定は、xmlファイルのdata/data/your.application.package/shared_prefs/フォルダに保存されます。ファイル名はyour.application.package_preferences.xmlです。

共有設定を取得するときは、Context.getSharedPreferencesメソッドを呼び出します。 SharedReferencesオブジェクトを作成し、SharedReferences.startLoadFromDiskメソッドを呼び出します。

この方法を開くと、環境設定(mFile)のxmlファイルが解析され、環境設定がメモリストレージ(map)に読み込まれることがわかります。

BufferedInputStream str = new BufferedInputStream(new FileInputStream(mFile), 16*1024); 
map = XmlUtils.readMapXml(str); 

その後、あなたは常にメモリからあなたの嗜好を読みます。より正確には変数private Map<String, Object> mMapからです。 また、アプリケーションはstartReloadIfChangedUnexpectedlyメソッドを呼び出すことができ、基礎となるファイルが変更されている場合は解析され、新しいHashMapが作成されます。あなたの質問に関しては

、次のような場合があります。

  1. あなたは新しいバージョンで設定項目を追加しました。次に、2番目のパラメータとして指定されたデフォルト値が返されます。注意:属性android:defaultValueは使用されないので注意してください。

    String v = (String)mMap.get(key); // not found => v = null

    return v != null ? v : defValue; // return defValue

  2. あなたは新しいバージョンで設定項目を削除しました。 xmlファイルとmapオブジェクトにはいくつかの冗長データが含まれますが、ユーザーが次に環境設定を保存するときに修正されます。

  3. 設定項目のキーを、使用されていないキーに変更しました。デフォルト値が返されます。 p.1と同じ結果です。

  4. あなたが(例えば、キーpref1_keyで)1つの設定項目を削除し、それが(pref2_keyからpref1_keyに)最初の項目を参照するように別のアイテムのキーを変更しました。次に、2番目の設定項目は最初の項目の値を持ちます。

  5. 設定項目のタイプを変更しました(ブール値からintなど)。次に、これと同様のコードのためにCastExceptionがスローされます:(Integer)mMap.get(key);。しかし、例えばEditTextPreferenceをListPreferenceに変更することができます。これは、両方ともString型を持つためです。

はたぶん、いくつかのより多くのテストケースがありますが、これまでのところ、私は唯一の5

また、ここまで作った好みの例はListPreference、EditTextPreferenceとCheckBoxPreferenceを持つファイルです:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <string name="pref_theme_key">THEME_LIGHT</string> 
    <string name="pref_homepage_key">test</string> 
    <boolean name="pref_display_name_key" value="true" /> 
</map> 
+0

詳細な答えをありがとうございました。あなたのリストされたケースはまさに私の頭の中にあったものです。私は、設定変更の構造がアプリ開発中のかなり一般的なシナリオだと思っていましたが、Androidのドキュメントでそれを扱うものは何も見つかりませんでした。たぶん、私は正しい文書を見ていませんでした。 – Hong

+2

@Hong時には正式な文書に情報がありません。そのため、私はgrepcodeウェブサイトを使用し、ソースコードを自分で調べます。 – vorrtex

2

アプリが新しい設定構造で更新されると、Androidは既存の設定データをどのように処理しますか?

"設定構造"が意味することは不明です。

SharedPreferencesは永続的であると考えることができます。HashMapさまざまなキーの下にさまざまな値を格納し、後でそれらを戻すことができます。 Androidは実際に何かを保存するまで、先祖のキーまたはそれらのキーの下に格納される値のタイプに関する知識がありません。

私の推測では、「環境設定構造」とは、「XMLの設定画面定義」を意味します。

  • あなたは新しい設定を追加した場合、Androidは好みの周りのすべてに沿ってきましたが、あなたが削除した場合、ユーザは

  • 前に、これらの設定を設定することがなかったかのように、通常はそれらを、処理します。その場合、あなたが以前に使用していた設定は、あなたがそれを取り除くことを選択しない限り、古いデータはそのまま残っています。 、論理的に同じものについてkeyAkey1に置き換えます)、好みのAndroidは、全く新しい好みとしてkey1を扱います、そしてあなたは、キーの変更を反映するために、あなたのSharedPreferencesデータを更新するために、どこかにあなたのコード内で知性を配置する必要があります、あなたがそう

を選択した場合は、noありSharedPreferencesOpenHelper相当のSQLiteOpenHelperを使用して、「スキーマのバージョン」の設定を管理し、データの移行を支援します。頻繁に変化する「嗜好構造」を管理するのに役立つと思うなら、そのようなシステムを作成することもできます。

関連する問題