草庐IT

java - 存储与类关联的键的最佳实践

coder 2023-12-04 原文

将类中使用的一组键值对存储在单独的接口(interface)中更好,还是将其存储在 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);

最佳答案

我想分享我为首选项存储所做的工作,我使用了 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. 要更改或检索数据,只需调用其关联的字段 getter/setter:

    sharedData.getPassword();
    sharedData.setPassword("new password");
    
  3. 最后,如果您更改字段,请不要忘记调用 saveIntoPreferences:

    sharedData.saveIntoPreferences();
    

希望这有助于解决您的问题。

关于java - 存储与类关联的键的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16027105/

有关java - 存储与类关联的键的最佳实践的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  5. ruby - 如果指定键的值在数组中相同,如何合并哈希 - 2

    我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat

  6. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  7. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  8. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  9. ruby - 在哈希的键数组中追加元素 - 2

    查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用

  10. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

随机推荐