2013-04-16 27 views
5

在一個單獨的界面中存儲類中使用的一組鍵值對是更好的做法還是將它存儲在strings.xml中更好?存儲與類關聯的鍵的最佳實踐

例如:

public interface PreferenceKeys { 
    static final String PREF1 = "pref1"; 
    static final String PREF2 = "pref2"; 
} 

,然後訪問它在我的代碼爲PreferenceKeys.PREF1

在string.xml存儲爲名稱 - 值對:

<string name="PREF1">pref1</string> 
<string name="PREF2">pref2</string> 

然後訪問它在我的課上:

String pref1 = getResources().getString(R.string.PREF1); 
+0

如果可以,請將其存儲在java中。如果必須將其存儲在conf文件中。 – ZhongYu

+0

爲什麼要在界面中保存首選項?問題是可以在xml文件(PreferenceScreen,PreferenceCategory等)中定義首選項。在這種情況下,應該定義android:key值,從那裏我們不能訪問java類。相同的android:defaultValue – Ewoks

回答

2

我想分享我爲偏好設置存儲所做的工作,我使用android的構建功能SharedPreferences。爲了方便訪問,我創建一個圍繞SharedPreferences的包裝稱爲UserModel有這樣的代碼:

package tv.gsgw.android.garusuta.model; 

import id.flwi.util.ActivityUtil; 
import tv.gsgw.android.garusuta.constant.DataConstant; 
import android.content.Context; 

public class UserModel implements DataConstant { 
    Context _context; 

    private String authKey = ""; 
    private String email = ""; 
    private String password = ""; 
    private String birthdate = ""; 
    private String prefacture = ""; 
    private String bloodType = ""; 
    private String idealBodyType = ""; 
    private String duration = ""; 
    private String stability = ""; 
    private String skin = ""; 
    private String relationship = ""; 
    private String height = ""; 
    private String weight = ""; 
    private boolean registerDataChange = false; 

    public UserModel(Context context){ 
     this._context = context; 
     loadFromPreferences(); 
    } 

    public void loadFromPreferences(){ 
     setAuthKey(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_AUTHKEY, "")); 
     setEmail(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_EMAIL, "")); 
     setPassword(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_PASSWORD, "")); 
     setBirthdate(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_BIRTHDATE, "")); 
     setPrefacture(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_PREFACTURE, "")); 
     setBloodType(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_BLOODTYPE, "")); 
     setIdealBodyType(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_BODYTYPE, "")); 
     setPeriod(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_DURATIONPERIOD, "")); 
     setStability(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_STABILITY, "")); 
     setSkin(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_SKINTYPE, "")); 
     setRelationship(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_RELATIONSHIP, "")); 
     setHeight(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_HEIGHT, "")); 
     setWeight(ActivityUtil.getSharedPreferenceString(_context, USER_DATA_FIELD_NAME_WEIGHT, "")); 
     setRegisterDataChange(ActivityUtil.getSharedPreferenceBoolean(_context, USER_DATA_FIELD_REGISTER_DATACHANGE, false)); 
    } 

    public void saveIntoPreferences(){ 
     saveIntoPreferences(true); 
    } 
    public void saveIntoPreferences(boolean datachanged){ 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_AUTHKEY, getAuthKey()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_EMAIL, getEmail()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_PASSWORD, getPassword()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_BIRTHDATE, getBirthdate()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_PREFACTURE, getPrefacture()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_BLOODTYPE, getBloodType()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_BODYTYPE, getIdealBodyType()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_DURATIONPERIOD, getPeriod()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_STABILITY, getStability()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_SKINTYPE, getSkin()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_RELATIONSHIP, getRelationship()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_HEIGHT, getHeight()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_NAME_WEIGHT, getWeight()); 
     ActivityUtil.setSharedPreference(_context, USER_DATA_FIELD_REGISTER_DATACHANGE, datachanged); 
    } 

    public String getAuthKey() { 
     return authKey; 
    } 

    public void setAuthKey(String authKey) { 
     this.authKey = authKey; 
    } 

    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public String getBirthdate() { 
     return birthdate; 
    } 

    public void setBirthdate(String birthdate) { 
     this.birthdate = birthdate; 
    } 

    public String getPrefacture() { 
     return prefacture; 
    } 

    public void setPrefacture(String prefacture) { 
     this.prefacture = prefacture; 
    } 

    public String getBloodType() { 
     return bloodType; 
    } 

    public void setBloodType(String bloodType) { 
     this.bloodType = bloodType; 
    } 

    public String getIdealBodyType() { 
     return idealBodyType; 
    } 

    public void setIdealBodyType(String idealBodyType) { 
     this.idealBodyType = idealBodyType; 
    } 

    public String getPeriod() { 
     return duration; 
    } 

    public void setPeriod(String period) { 
     this.duration = period; 
    } 

    public String getSkin() { 
     return skin; 
    } 

    public void setSkin(String skin) { 
     this.skin = skin; 
    } 

    public String getRelationship() { 
     return relationship; 
    } 

    public void setRelationship(String relationship) { 
     this.relationship = relationship; 
    } 

    public String getHeight() { 
     return height; 
    } 

    public void setHeight(String height) { 
     this.height = height; 
    } 

    public String getWeight() { 
     return weight; 
    } 

    public void setWeight(String weight) { 
     this.weight = weight; 
    } 

    public boolean isRegisterDataChange() { 
     return registerDataChange; 
    } 

    public void setRegisterDataChange(boolean registerDataChange) { 
     this.registerDataChange = registerDataChange; 
    } 

    public String getStability() { 
     return stability; 
    } 

    public void setStability(String stability) { 
     this.stability = stability; 
    } 

    public void setRegistrationChanged(boolean dataChange) { 
     this.registerDataChange = dataChange; 
    } 

    public String toString(){ 
     String str = ""; 

     str += "authKey: " + authKey + "\n"; 
     str += "email: " + email + "\n"; 
     str += "password: " + password + "\n"; 
     str += "birthdate: " + birthdate + "\n"; 
     str += "prefacture: " + prefacture + "\n"; 
     str += "bloodType: " + bloodType + "\n"; 
     str += "idealBodyType: " + idealBodyType + "\n"; 
     str += "duration: " + duration + "\n"; 
     str += "stability: " + stability + "\n"; 
     str += "skin: " + skin + "\n"; 
     str += "relationship: " + relationship + "\n"; 
     str += "height: " + height + "\n"; 
     str += "weight: " + weight + "\n"; 
     str += "registerDataChange: " + (registerDataChange ? "true" : "false") + "\n"; 

     return str; 
    } 

} 

DataConstant在上面的代碼僅僅是包含這樣的常數變量的類:

public static final String USER_DATA_FIELD_NAME_AUTHKEY = "new_AuthKey"; 
public static final String USER_DATA_FIELD_NAME_EMAIL = "new_Email"; 
public static final String USER_DATA_FIELD_NAME_PASSWORD = "new_Password"; 
public static final String USER_DATA_FIELD_NAME_BIRTHDATE = "new_Birthday"; 
public static final String USER_DATA_FIELD_NAME_PREFACTURE = "new_Prefacture"; 
public static final String USER_DATA_FIELD_NAME_BLOODTYPE = "new_BloodType"; 
public static final String USER_DATA_FIELD_NAME_BODYTYPE = "new_IdealBodyType"; 
public static final String USER_DATA_FIELD_NAME_DURATIONPERIOD = "new_Duration"; 
public static final String USER_DATA_FIELD_NAME_STABILITY = "new_Stability"; 
public static final String USER_DATA_FIELD_NAME_SKINTYPE = "new_Skin"; 
public static final String USER_DATA_FIELD_NAME_RELATIONSHIP = "new_Relationship"; 
public static final String USER_DATA_FIELD_NAME_HEIGHT = "new_Height"; 
public static final String USER_DATA_FIELD_NAME_WEIGHT = "new_Weight"; 
public static final String USER_DATA_FIELD_NAME_PHY_1 = "new_phy1"; 
public static final String USER_DATA_FIELD_NAME_PHY_2 = "new_phy2"; 

此使用工具類,它也創造幫助SharedPreferences工作更容易:

package id.flwi.util; 

/** 
* @author Arief Bayu Purwanto 
*/ 
import java.io.BufferedInputStream; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.util.Calendar; 

import android.content.Context; 
import android.content.SharedPreferences; 
import android.os.Bundle; 
import android.util.Log; 

public class ActivityUtil { 
    public static final String PREFS_NAME = "____MyPrefsFile"; 

    public static void debugExtra(Bundle extras){ 
     if(extras != null) { 
      Log.i("Log", "printing all extras information"); 
      java.util.Set<String> keys = extras.keySet(); 
      java.util.Iterator<String> keyIterator = keys.iterator(); 
      int index = 0; 
      while(keyIterator.hasNext()) { 
       Log.i("log", " extras #" + (++index) + ": " + keyIterator.next()); 
      } 
     } else { 
      Log.i("Log", "empty extras"); 
     } 
    } 

    public static boolean getSharedPreferenceBoolean(Context c, String preference){ 
     SharedPreferences settings = c.getSharedPreferences(ActivityUtil.PREFS_NAME, 0); 
     return settings.getBoolean(preference, false); 
    } 
    public static boolean getSharedPreferenceBoolean(Context c, String preference, boolean defaultValue){ 
     SharedPreferences settings = c.getSharedPreferences(ActivityUtil.PREFS_NAME, 0); 
     return settings.getBoolean(preference, defaultValue); 
    } 
    public static String getSharedPreferenceString(Context c, String preference){ 
     SharedPreferences settings = c.getSharedPreferences(ActivityUtil.PREFS_NAME, 0); 
     return settings.getString(preference, ""); 
    } 
    public static String getSharedPreferenceString(Context c, String preference, String defaultValue){ 
     SharedPreferences settings = c.getSharedPreferences(ActivityUtil.PREFS_NAME, 0); 
     return settings.getString(preference, defaultValue); 
    } 
    public static int getSharedPreferenceInt(Context c, String preference, int defaultValue){ 
     SharedPreferences settings = c.getSharedPreferences(ActivityUtil.PREFS_NAME, 0); 
     return settings.getInt(preference, defaultValue); 
    } 

    public static long getSharedPreferenceLong(Context c, String preference, long defaultValue){ 
     SharedPreferences settings = c.getSharedPreferences(ActivityUtil.PREFS_NAME, 0); 
     return settings.getLong(preference, defaultValue); 
    } 

    public static void setSharedPreference(Context c, String preference, boolean prefValue){ 

     SharedPreferences settings = c.getSharedPreferences(ActivityUtil.PREFS_NAME, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putBoolean(preference, prefValue); 
     editor.commit(); 
    } 

    public static void setSharedPreference(Context c, String preference, Long prefValue){ 

     SharedPreferences settings = c.getSharedPreferences(ActivityUtil.PREFS_NAME, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putLong(preference, prefValue); 
     editor.commit(); 
    } 

    public static void setSharedPreference(Context c, String preference, int prefValue){ 

     SharedPreferences settings = c.getSharedPreferences(ActivityUtil.PREFS_NAME, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putInt(preference, prefValue); 
     editor.commit(); 
    } 
    public static void setSharedPreference(Context c, String preference, String prefValue){ 
     SharedPreferences settings = c.getSharedPreferences(ActivityUtil.PREFS_NAME, 0); 
     SharedPreferences.Editor editor = settings.edit(); 
     editor.putString(preference, prefValue); 
     editor.commit(); 
    } 

} 

使用它是公關etty簡單:

  1. 加載數據,你只需要調用:

    UserModel sharedData = new UserModel(getApplicationContext()); 
    
  2. 要更改或獲取數據只需要調用它的相關領域的getter/setter:

    sharedData.getPassword(); 
    sharedData.setPassword("new password"); 
    
  3. 最後,如果您更改了字段,請不要忘記致電saveIntoPreferences

    sharedData.saveIntoPreferences(); 
    

希望這有助於解決您的問題。

+0

這是正確的答案。其他答案很簡單,但我想當時其他作者對Android不感興趣。問題是Preferences也可以在xml佈局中定義,並且在該位置鍵和默認值也應該被提供。有一個問題,如果這些是在java的class中定義的,我們將無法訪問這些常量 – Ewoks

0

在我看來,儘量減少在您的項目中使用「上下文」,以避免內存泄漏或加載不必要的資源。

共享首選項是一個很好的選擇,但需要使用應用程序或活動的上下文。當你想要保留一些動態值時經常使用,是這種情況嗎?

Java接口只使用最終成員(靜態),並且代碼中非常緊湊且易於使用(記住)。嘗試始終使用靜態不變的成員(如IP,密碼等)。

此外,使用枚舉來管理狀態或者其他的東西在你的應用程序,通過實例

public interface Preferences { 
    public String HOST = "http://xxx.xxx.xxx.xxx"; 
    public String PREF1 = "pref1"; 
    public String PREF2 = "pref2"; 
    public enum Connection { CONNECTED, DISCONNECTED, UNKNOWN } 
} 
+0

我不太明白這裏的實際情況是什麼? – Ewoks

0

這取決於你使用的Java類或sharedPreference,它們之間的diffenerce是你的目的。 在我看來,如果你想保存常量只需使用擴展枚舉的Java類。 否則,用戶數據,會話數據保存在sharedPreference中,你可以參考ariefbayu的答案,但是在我的建議中使用反射來獲得你的字段的值。

0

我更喜歡使用strings.xml來尋找需要在佈局文件中使用的資源。 對於需要在課堂上訪問的變量,我更喜歡interface的方式。