9

たとえば、設定のいくつかのエントリが追加または削除された場合、アプリが新しい設定構造で更新されたときに、Android は既存の設定データをどのように処理しますか?

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

4

2 に答える 2

6

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

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

このメソッドを開くと、設定を含む xml ファイル ( mFile) が解析され、設定がメモリ ストレージに読み込まれることがわかります ( 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. 1 つの基本設定項目を削除し (pref1_keyたとえば、キーを使用して)、別の項目のキーを変更して、最初の項目を参照するようにしました (からpref2_keypref1_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>
于 2012-12-29T16:38:17.840 に答える
2

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

「設定構造」の意味が不明です。

SharedPreferencesは永続的なと考えることができますHashMap。さまざまなキーの下にさまざまな値を保存し、後でそれらを取得できます。Android は、実際に何かを保存するまで、それらのキーの下に保存されるキーまたは値の型についてアプリオリな知識を持っていません。

私の推測では、「設定構造」とは、「XML での設定画面定義」を意味していると思います。その場合:

  • 新しい設定を追加すると、Android はそれらを通常どおり処理します。これは、設定が最初から存在しているものの、ユーザーがそれらの設定を一度も設定したことがないかのように処理されます。

  • 以前に使用した設定を削除すると、削除しない限り、古いデータが残ります。Android は、そのデータを二度と使用しないことを知る方法がないためです。

  • 設定のキーを変更すると (つまり、論理的に同じ設定を置き換える)、Android はまったく新しい設定として扱わkeyAれるため、データを更新してキーを反映するようにコードのどこかにスマートを配置する必要があります。変更、選択した場合key1key1SharedPreferences

設定の「スキーマ バージョン」を管理し、データの移行を支援することにSharedPreferencesOpenHelper相当するものはありません。SQLiteOpenHelper頻繁に変化する「選好構造」を管理するのに役立つと思われる場合は、そのようなシステムを作成することを歓迎します。

于 2012-12-29T15:49:06.733 に答える