环顾四周后,我找到了一个示例并最终实现了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;
}