3

ドキュメントによると、コンテンツを保存する方法はいくつかあります。それらの 1 つはdatabaseで、そのうちの 1 つはSharedPreferences経由です。

私のアプリでは、既にデータベースを使用しているため、すべてを 1 か所に保存する、つまり設定もデータベースに保存するのが最善の方法だと考えています。周りを検索すると、SharedPreferencesに関連する例のみが見つかります。xml ファイルで設定構造を定義すると、メンテナンスが容易になるという利点がありますが、サブメニュー/サブ画面で背景色が正しく表示されないという欠点があります。

  1. SharedPreferencesを使用したアプローチは、私がやりたいこと、または独自の構造 (デフォルト値用) とレイアウト resp を作成する必要があることに対して適切ですか? ビュー(プレゼンテーション用)?

  2. データベースに設定を保存するための PreferenceActivity を使用した有効なサンプルを知っている人はいますか? R.xml.preferences==> PreferenceScreen?

4

2 に答える 2

0

見回した後、サンプルと最終的に実装されたPreferenceActivityを見つけました。これに基づいて、不要なものを切り取り、残りを残します (特に、個々の実装の DB 更新と読み取り値。しかし、正直なところ、それはそれほど難しくないと思います。

public class MyPreferences extends PreferenceActivity {

  public class CursorPreferenceHack implements SharedPreferences {

    protected Map<String, Object> values = new HashMap<String, Object>();
    private DBPreferences         dbPreferences;

    public CursorPreferenceHack() {
      dbPreferences = new DBPreferences();
      values = dbPreferences.cacheValues();
    }

    public boolean contains(String key) {
      return values.containsKey(key);
    }

    public class Editor implements SharedPreferences.Editor {

      private ContentValues update = new ContentValues();

      public SharedPreferences.Editor clear() {
        update = new ContentValues();
        return this;
      }

      public boolean commit() {
        dbPreferences.updateValues(update);
        // make sure we refresh the parent cached values
        values = dbPreferences.cacheValues();

        // and update any listeners
        for (OnSharedPreferenceChangeListener listener : listeners) {
          listener.onSharedPreferenceChanged(CursorPreferenceHack.this, null);
        }

        return true;
      }

      // Gingerbread compatibility
      public void apply() {
        commit();
      }

      public android.content.SharedPreferences.Editor putBoolean(String key,
                                                                 boolean value) {
        return this.putString(key, Boolean.toString(value));
      }

      public android.content.SharedPreferences.Editor putFloat(String key,
                                                               float value) {
        return this.putString(key, Float.toString(value));
      }

      public android.content.SharedPreferences.Editor putInt(String key,
                                                             int value) {
        return this.putString(key, Integer.toString(value));
      }

      public android.content.SharedPreferences.Editor putLong(String key,
                                                              long value) {
        return this.putString(key, Long.toString(value));
      }

      public android.content.SharedPreferences.Editor putString(String key,
                                                                String value) {
        update.put(key, value);
        return this;
      }

      public android.content.SharedPreferences.Editor remove(String key) {
        update.remove(key);
        return this;
      }

      public android.content.SharedPreferences.Editor putStringSet(String key,
                                                                   Set<String> value) {
        throw new UnsupportedOperationException("HostEditor Prefs do not support Set<String>");
      }
    }

    public Editor edit() {
      return new Editor();
    }

    public Map<String, ?> getAll() {
      return values;
    }

    public boolean getBoolean(String key, boolean defValue) {
      return Boolean.valueOf(this.getString(key, Boolean.toString(defValue)));
    }

    public float getFloat(String key, float defValue) {
      return Float.valueOf(this.getString(key, Float.toString(defValue)));
    }

    public int getInt(String key, int defValue) {
      return Integer.valueOf(this.getString(key, Integer.toString(defValue)));
    }

    public long getLong(String key, long defValue) {
      return Long.valueOf(this.getString(key, Long.toString(defValue)));
    }

    public String getString(String key, String defValue) {
      if (!values.containsKey(key))
        return defValue;
      return (String) values.get(key);
    }

    public Set<String> getStringSet(String key, Set<String> defValue) {
      throw new ClassCastException("HostEditor Prefs do not support Set<String>");
    }

    protected List<OnSharedPreferenceChangeListener> listeners = new LinkedList<OnSharedPreferenceChangeListener>();

    public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
      listeners.add(listener);
    }

    public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) {
      listeners.remove(listener);
    }

  }

  @Override
  public SharedPreferences getSharedPreferences(String name, int mode) {
    return this.pref;
  }

  private CursorPreferenceHack  pref;

  @Override
  public void onCreate(Bundle icicle) {
    super.onCreate(icicle);

    this.pref = new CursorPreferenceHack();
    // this.pref.registerOnSharedPreferenceChangeListener(this);

    this.addPreferencesFromResource(R.xml.preferences);
  }
}

そして、cacheValues について

public Map<String, Object> cacheValues() {
    Map<String, Object> retValues = new HashMap<String, Object>();
       SQLiteDatabase db = dbManager.getReadableDatabase();
    Cursor cursor = db.query(dbTblPref, new String[] { "pref_key", 
        "pref_value" }, null, null, null, null, null);

    if (cursor.moveToFirst()) {
      do {

        retValues.put(cursor.getString(0),cursor.getString(1));
      } while (cursor.moveToNext());
    }
    cursor.close();

    return retValues;
  }
于 2013-06-10T13:50:00.560 に答える