3

根据文档,有几种存储内容的方法。其中之一是数据库,其中之一是通过SharedPreferences

对于我的应用程序,我已经使用了一个数据库,因此认为最好的方法是将所有内容存储在一个地方,即将我的偏好也存储在数据库中。环顾四周,我只找到与SharedPreferences相关的示例。在 xml 文件中定义首选项结构具有易于维护的优点,但缺点是背景颜色与子菜单/子屏幕错误。

  1. SharedPreferences的方法是否适合我想做的事情,或者我需要制作自己的结构(对于默认值)和布局。查看(用于演示)?

  2. 有人知道使用 PreferenceActivity 将设置保存在数据库中的有效样本吗? R.xml.preferences==> PreferenceScreen?

4

2 回答 2

2

我会将首选项存储在SharedPreferences其中 - 这就是它们的用途,有一整套用于它们的类和方法。您当然可以将它们存储在您自己的数据库中,但您必须设置表、编写适配器等等。有什么好处?

我的很多应用程序中都有一个 sqlite 数据库来存储内容等。我存储在SharedPreferences.

于 2013-06-06T14:26:00.713 回答
0

环顾四周后,我找到了一个示例并最终实现了PreferenceActivity。基于此,我删除了不需要的内容并保留了其余部分(尤其是单独实现的 DB-update 和 read-values。但老实说,我认为这不会太难。

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);
  }
}

对于缓存值

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 回答