2013-04-16 27 views
5

Thực hành tốt hơn để lưu trữ một tập hợp các cặp khóa-giá trị được sử dụng trong một lớp trong một giao diện riêng biệt hay thực hành tốt hơn để lưu trữ nó trong strings.xml?Cách thực hành tốt nhất để lưu trữ khóa được liên kết với một lớp

ví dụ: :

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

Và sau đó truy cập nó trong mã của tôi như PreferenceKeys.PREF1

vs

lưu trữ như các cặp tên-giá trị trong string.xml:

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

Và sau đó truy cập trong lớp học của tôi là:

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

lưu trữ trong java nếu bạn có thể. lưu trữ nó trong tập tin conf nếu bạn phải. – ZhongYu

+0

Tại sao một nút lưu khóa ưu tiên trong giao diện ??? Vấn đề là người ta có thể định nghĩa các sở thích trong tệp xml (PreferenceScreen, PreferenceCategory, vv ..). Trong trường hợp đó ta nên xác định giá trị android: key và từ đó chúng ta không thể truy cập lớp java. Tương tự cho android: defaultValue – Ewoks

Trả lời

2

Tôi muốn chia sẻ những gì tôi đã làm để lưu trữ tùy chọn, tôi sử dụng tính năng xây dựng của android trong tính năng được gọi là SharedPreferences. Để dễ dàng truy cập, tôi có thể tạo một wrapper xung quanh SharedPreferences gọi UserModel có mã như thế này:

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 trong mã trên chỉ là một lớp có chứa biến liên tục như thế này:

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"; 

này sử dụng một lớp tiện ích cũng tạo để giúp làm việc với SharedPreferences dễ dàng hơn:

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

} 

Sử dụng nó là pr Etty đơn giản:

  1. Để tải các dữ liệu, bạn chỉ cần gọi:

    UserModel sharedData = new UserModel(getApplicationContext()); 
    
  2. Để thay đổi hoặc lấy dữ liệu chỉ cần gọi nó liên quan đến lĩnh vực getter/setter:

    sharedData.getPassword(); 
    sharedData.setPassword("new password"); 
    
  3. Cuối cùng, nếu bạn thay đổi (các) trường, đừng quên gọi saveIntoPreferences:

    sharedData.saveIntoPreferences(); 
    

Hy vọng điều này sẽ giúp giải quyết vấn đề của bạn.

+0

Đây là câu trả lời đúng. Câu trả lời khác là vô nghĩa đơn giản nhưng tôi đoán tại thời điểm các tác giả khác không quan tâm đến Android. Vấn đề là Preferences cũng có thể được định nghĩa trong bố cục xml và tại vị trí đó, giá trị mặc định cũng nên được cung cấp. Có một vấn đề nếu những người được xác định trong nguyên nhân lớp java từ xml chúng tôi sẽ không có quyền truy cập vào những hằng số – Ewoks

0

Theo ý kiến ​​của tôi, hãy cố gắng giảm thiểu việc sử dụng "ngữ cảnh" trong dự án của bạn để tránh rò rỉ bộ nhớ hoặc tải tài nguyên thừa.

Tùy chọn được chia sẻ là một tùy chọn tốt nhưng cần sử dụng ngữ cảnh của ứng dụng hoặc hoạt động. Thường được sử dụng khi bạn muốn tồn tại một số giá trị động, đây có phải là trường hợp không ?.

Giao diện Java chỉ sử dụng thành viên cuối cùng (tĩnh) và rất nhỏ gọn và dễ sử dụng (ghi nhớ) trong mã. Cố gắng sử dụng luôn luôn bạn có các thành viên không thể khắc phục tĩnh (như ip, mật khẩu, v.v.).

Ngoài ra, enums sử dụng để quản lý các tiểu bang hoặc thứ khác trong ứng dụng của bạn, bằng cách ví dụ

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

Tôi đã không hoàn toàn hiểu những gì thực sự là điểm của bạn ở đây? – Ewoks

0

Đó là tùy thuộc vào bạn sử dụng lớp java hoặc trong sharedPreference, các diffenerce giữa chúng là mục đích của bạn. Theo ý kiến ​​của tôi, nếu bạn muốn lưu các hằng số, chỉ cần sử dụng lớp java mở rộng Enum. Nếu không, dữ liệu người dùng, dữ liệu phiên được lưu trong sharedPreference, bạn có thể tham khảo câu trả lời của ariefbayu, nhưng trong lời khuyên sử dụng của tôi phản ánh để nhận giá trị của trường.

0

Tôi thích sử dụng strings.xml cho các tài nguyên cần được sử dụng trong tệp bố cục. Đối với các biến cần được truy cập trong lớp tôi thích cách interface.

Các vấn đề liên quan