2013-04-16 3 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(); 
    } 

} 

Используя это пр Этти просто:

  1. Чтобы загрузить данные, нужно просто позвонить:

    UserModel sharedData = new UserModel(getApplicationContext()); 
    
  2. Для изменения или извлечения данных просто вызовите это связано поле геттер/сеттер:

    sharedData.getPassword(); 
    sharedData.setPassword("new password"); 
    
  3. И наконец, если вы меняете поле, просто не забудьте позвонить по телефону saveIntoPreferences:

    sharedData.saveIntoPreferences(); 
    

Надеюсь, что эта помощь поможет решить вашу проблему.

+0

Это правильный ответ. Другие ответы - простая глупость, но я думаю, что в то время другие авторы не интересовались Android. Дело в том, что Preferences можно также определить в макетах xml, а также указать ключ местоположения и значение по умолчанию. Есть проблема, если они определены в java-классе, потому что из xml у нас не будет доступа к этим константам. – 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-класс, который расширяет Enum. В противном случае данные пользователя, данные сеанса, сохраненные в sharedPreference, можно отнести ответ ariefbayu, но в моем совете используйте его, чтобы получить значение вашего поля.

0

Я предпочитаю использовать strings.xml для ресурсов, которые необходимо использовать в файлах макета. Для переменных, которые необходимо получить в классе, я предпочитаю путь interface.

Смежные вопросы