5

文字列設定の保存に問題があります。保存するためのこれらのユーティリティ メソッドがあります。

public static void putStringSet(SharedPreferences pref, Editor e, String key, Set<String> set)
{
    if (Utils.isApiLevelGreaterThanGingerbread())
    {
        // e.remove(key); // I tried to remove it here
        e.putStringSet(key, set);
    }
    else
    {
        // removes old occurences of key
        for (String k : pref.getAll().keySet())
        {
            if (k.startsWith(key))
            {
                e.remove(k);
            }
        }

        int i = 0;
        for (String value : set)
        {
            e.putString(key + i++, value);
        }
    }
}

public static Set<String> getStringSet(SharedPreferences pref, String key, Set<String> defaultValue)
{
    if (Utils.isApiLevelGreaterThanGingerbread())
    {
        return pref.getStringSet(key, defaultValue);
    }
    else
    {
        Set<String> set = new HashSet<String>();

        int i = 0;

        Set<String> keySet = pref.getAll().keySet();
        while (keySet.contains(key + i))
        {
            set.add(pref.getString(key + i, ""));
            i++;
        }

        if (set.isEmpty())
        {
            return defaultValue;
        }
        else
        {
            return set;
        }
    }
}

これらのメソッドを使用して、GB との下位互換性を維持しています。しかし、putStringSet メソッドの使用が API > ジンジャーブレッドに対して永続的ではないという問題があります。アプリの実行中は永続的です。しかし、再起動すると消えます。手順を説明します。

  1. アプリケーションのクリーン インストール - キー X の設定はありません
  2. キー X で文字列セット A を保存します - 設定には A が含まれます
  3. 文字列セット B をキー X で保存します - 設定には B が含まれます
  4. アプリを閉じる
  5. アプリの再起動 - 設定に A が含まれています
  6. 文字列セット C をキー X で保存します - 設定には C が含まれます
  7. アプリを閉じる
  8. アプリの再起動 - 設定に A が含まれています

したがって、最初の値のみが永続的であり、上書きすることはできません。

その他の注意事項:

  1. このメソッドは、putStringSet と getStringSet を置き換えるだけです。だから私は commit() を使用します...しかし、他の場所で (以下の例を参照)。
  2. commit() を apply() に置き換えようとしました - 成功しませんでした
  3. 新しい API で古い API のコードを使用すると (両方のメソッドで最初の 4 行をコメントしました)、問題なく動作しますが、それほど効率的ではありません。

使用例:

Editor e = mPref.edit();
PreferencesUtils.putStringSet(mPref, e, GlobalPreferences.INCLUDED_DIRECTORIES, dirs);
e.commit();

どうもありがとうございました。

4

2 に答える 2

1

私の状態はあなたの状態と非常に似ています。唯一の違いは、アプリを再起動すると、設定には A、B、C が含まれますが、再インストールまたは電話を再起動すると、B&C がなくなります。

また、この投稿ではSharedPreferences は永続的ではないとアドバイスされていますが、それでも機能しないため、commit() を apply() に置き換えてみました。

置き換える前に設定を削除してコミットすることで、この問題を解決しました。

editor.remove("StringSetKey");
editor.commit();

editor.putStringSet("StringSetKey", newSet);
editor.commit();

Ps: adb pull /data/data/<packagename>/shared_prefs/xxxx.xmlcommit() が実際に機能するかどうかを確認するには、cmd 行に入力してください。

Pps: これは putStringSet のバグだと思います....

これがあなたを助けることを願っています;)

于 2013-07-15T04:45:39.983 に答える