将类中使用的一组键值对存储在单独的接口(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();
}
}
使用起来非常简单:
要加载数据,您只需调用:
UserModel sharedData = new UserModel(getApplicationContext());
要更改或检索数据,只需调用其关联的字段 getter/setter:
sharedData.getPassword();
sharedData.setPassword("new password");
最后,如果您更改字段,请不要忘记调用 saveIntoPreferences:
sharedData.saveIntoPreferences();
希望这有助于解决您的问题。
关于java - 存储与类关联的键的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16027105/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我主要使用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
我正在使用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].有没有一种方法可以
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我有一个这样的哈希数组:[{: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
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案
我正在尝试使用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
我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下: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列,在这种情况下
查看我的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([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我