2013-06-06 2 views
2

설명서에 따르면 콘텐츠를 저장하는 몇 가지 방법이 있습니다. 그 중 하나는 데이터베이스이고, 그 중 하나는 SharedPreferences입니다.데이터베이스에 환경 설정을 저장하는 방법은 무엇입니까?

내 앱의 경우 이미 데이터베이스가 사용 중이므로 모든 것을 한 곳에서 저장하는 것이 좋습니다. 즉 데이터베이스에 환경 설정을 저장하는 것이 가장 좋습니다. 주위를 검색하면 SharedPreferences과 관련된 예제 만 있습니다. XML 파일에 환경 설정 구조를 정의하면 유지 관리가 쉽지만 하위 메뉴/하위 화면에서는 배경색에 결함이 있다는 단점이 있습니다.

  1. 내가 뭘하고 싶어 아니면 내가 내 자신의 (디폴트 값) 구조와 레이아웃 RESP을해야하는 일에 적합한 된 SharedPreferences와 접근 방식입니다. 보기 (프레젠테이션 용)?

  2. 아무도 데이터베이스의 설정을 저장하는 데 PreferenceActivity가있는 유효한 샘플을 알고 있습니까? R.xml.preferences ==>PreferenceScreen?

답변

2

나는 SharedPreferences에서 환경 설정을 저장하는 것 - 그것은 그들이 거기에 무엇을, 그들을위한 클래스와 메소드의 전체 세트가있다. 자신의 데이터베이스에 저장할 수는 있지만 테이블을 설정하고 어댑터를 작성해야합니다. 이점은 무엇입니까?

많은 앱에 콘텐츠 등을 저장하는 sqlite db가 있습니다. 선호도는 SharedPreferences입니다.

+0

에 대한 . 나는 아마도 '때와 SharedPreferences'I 수, 그래. 정말 데이터베이스로 다시 적용하는 문제. 것 내보내기 및 다시 적용 할 수있는 코드를 작성해야하지만 처음에는 데이터베이스에 저장하는 데 많은 노력을 기울이고 싶습니다. – LeO

+0

나는 문제가 발생할 것이라고 미리 생각하고 있다고 생각합니다. 절대로 결코 일어나지 않을 것이다. :) 행운을 빕니다! –

+0

혜택은 다음과 같습니다. – ComeIn

0

주변을 둘러보고 난 후에 sample을 찾았고 최종적으로 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; 
    } 
관련 문제