SharedPreferences 特点
即便是Android小白都知道的SharedPreferences的用法,这是保存数据最简便的方法,但是不处理好的话后期维护将是一个巨大的坑。那么该如何处理好SharedPreferences才方便维护呢。先从它的特点开始入手吧。
SharedPreferences的具体实现并不在公开API内,创建方法只有通过Context获取。具体实现我们不去研究,通过Log打印每次获取的对象都是同一个,同样的方法可知道每次edit()都会得到不同的对象。
难以维护的 SharedPreferences
SharedPreference userPreferences = context.getSharedPreferences("UserInfo", Context.MODE_PRIVATE); userPreferences.edit() .putString("id", "myId") .putString("name", "myName") .putString("head", "myHead") .commit(); Log.e("id", userPreferences.getString("id","")); Log.e("name", userPreferences.getString("name","")); Log.e("head", userPreferences.getString("head",""));
如上一段SharedPreferences保存和读取的方法非常简便,正因此才不易维护,可能因为写错Key而找不出问题所在,当然一般我们都会把Key写成静态常量。但随着项目增大,可能需要多处修改用户信息,每次都要一个个put(), 除了写着厌烦看着难受,当遇到需要增加或减少字段时也非常不便。
SharedPreferences 该这么写
如果能保留原有写法,又能规范方法那是最好不过了,看下SharedPreferences的接口方法并不多,很容易就写个包装类封装下。
import android.content.SharedPreferences; import android.support.annotation.Nullable; import java.util.Map; import java.util.Set; /** * SharedPreferences 包装类 * Created by wittytutu on 17-3-29. */ public class PreferencesWrapper implements SharedPreferences { protected SharedPreferences mPreferences; public PreferencesWrapper(SharedPreferences preferences) { mPreferences = preferences; } @Override public Map getAll() { return mPreferences.getAll(); } @Nullable @Override public String getString(String key, @Nullable String defValue) { return mPreferences.getString(key, defValue); } @Nullable @Override public Set getStringSet(String key, @Nullable Set defValues) { return mPreferences.getStringSet(key, defValues); } @Override public int getInt(String key, int defValue) { return mPreferences.getInt(key, defValue); } @Override public long getLong(String key, long defValue) { return mPreferences.getLong(key, defValue); } @Override public float getFloat(String key, float defValue) { return mPreferences.getFloat(key, defValue); } @Override public boolean getBoolean(String key, boolean defValue) { return mPreferences.getBoolean(key, defValue); } @Override public boolean contains(String key) { return mPreferences.contains(key); } @Override public EditorWrapper edit() { return new EditorWrapper(mPreferences.edit()); } @Override public void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { mPreferences.registerOnSharedPreferenceChangeListener(listener); } @Override public void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener) { mPreferences.unregisterOnSharedPreferenceChangeListener(listener); } public static class EditorWrapper implements Editor { protected Editor mEditor; public EditorWrapper(Editor editor) { mEditor = editor; } @Override public EditorWrapper putString(String key, @Nullable String value) { mEditor.putString(key, value); return this; } @Override public EditorWrapper putStringSet(String key, @Nullable Set values) { mEditor.putStringSet(key, values); return this; } @Override public EditorWrapper putInt(String key, int value) { mEditor.putInt(key, value); return this; } @Override public EditorWrapper putLong(String key, long value) { mEditor.putLong(key, value); return this; } @Override public EditorWrapper putFloat(String key, float value) { mEditor.putFloat(key, value); return this; } @Override public EditorWrapper putBoolean(String key, boolean value) { mEditor.putBoolean(key, value); return this; } @Override public EditorWrapper remove(String key) { mEditor.remove(key); return this; } @Override public EditorWrapper clear() { mEditor.clear(); return this; } @Override public boolean commit() { return mEditor.commit(); } @Override public void apply() { mEditor.apply(); } } }
接下来的使用就简单了
public class UserInfoPreferences extends PreferencesWrapper { private static final String NAME = "UserInfo"; public static final KEY_ID = "id" public static final KEY_NAME = "name"; public static final KEY_HEAD = "head"; public static final KEY_SEX = "sex"; private static volatile UserInfoPreferences mPreferences; public static UserInfoPreferences getInstance(Context context){ if(mPreferences == null) { synchronized (UserInfoPreferences.class){ if(mPreferences == null) { SharedPreferences preferences = context.getApplicationCtontext().getShaedPreferences(NAME, Context.MODE_PRIVATE); mPreferences = new UserInfoPreferences(preferences); } } } return mPreferences; } public UserInfoPreferences(SharedPreferences preferences) { super(preferences); } // 获取用户信息 public UserInfo getUserInfo(){ String id = mPreferences.getString(KEY_ID, ""); String name = mPreferences.getString(KEY_NAME, ""); String head = mPreferences.getString(KEY_HEAD, ""); return new UserInfo(id, name, head); } @Override public Editor edit(){ return new Editor(mPreferences.edit()); } public static class Editor extends EditorWrapper { public Editor(SharedPreferences.Editor editor) { super(editor); } // 保存用户信息 public Editor putUserInfo(String id, String name, String head) { mEditor.putString(KEY_ID, id) .putString(KEY_AME, name) .putString(KEY_HEAD, head); return this; } // 清空用户信息 public Editor clearUserInfo() { mEditor.remove(KEY_ID) .remove(KEY_NAME) .remove(KEY_HEAD); return this; } } }
调用即方便扩展,也保留了原有方法。
UserInfoPreferences preferences = UserInfoPreferences.getInstance(context); preferences.edit() .clearUserInfo() .putUserInfo("myId", "myName", "myHead") .putInt(KEY_SEX, 0) .commit(); UserInfo userInfo = preferences.getUserInfo(); int sex = preferences.getInt(KEY_SEX, 0);
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
前言:我试图在关系数据库的MVC体系结构中使用存储库模式。 我最近开始学习PHP中的TDD,我意识到我的数据库与应用程序的其余部分耦合得太紧密了。我读过关于存储库和使用IoC容器将其“注入”到我的控制器中的文章。很酷的东西。但现在有一些关于存储库设计的实际问题。请考虑以下示例。 所有这些查找方法都使用选择所有字段()方法。然而,在我的应用程序中,我总是试图限制我得到的字段的数量,因为这经常增加开销
我的应用程序只是一个看起来像这样的简单清单 ReactJS中的map函数有一些奇怪的行为。 每当我打印出来以检查值是否确实用console.log(todo.completed)更改时,它会在控制台中打印出正确的值,但随后我尝试打印出整个对象列表,突然它又回到了原来的状态。在本例中,我单击了选项1 这是我打印出常量updatedItems时的结果 我可以改变任何其他属性没有任何麻烦,我甚至可以设置
问题内容: 我正在使用 mysql dbms存储来自Wikipedia的页面。我已使用指令在my.cnf文件中将字符集编码设置为(维基百科编码): 并使用属性定义创建了我的数据库。 我还通过以下方式更改了mysqld客户端的字符集编码: 在初始化我的jdbc驱动程序时插入属性。 进行查询 但是我注意到mysql服务器用其他字符替换了一些字符。 例如,它替换为。 更新 我已经运行的命令确保这两个和的
问题内容: 让我解释一下:我并不是在问将特定日期时间的时区存储在数据库中的正确方法。我说的是时区本身。例如: 我有一个名为“用户”的MySQL表。现在,在此表上,我希望有一列包含用户居住地的时区(由用户提供,将从列表中选择)。我正在使用PHP,其中包含类似以下时区字符串的列表: 美国时区列表 现在,显而易见的解决方案(至少对我而言)是在“用户”表中创建VARCHAR列,然后将PHP使用的时区字符串
我一直在研究散列/加密密码并将其存储在数据库中的正确方法。我知道盐和散列,所以我环顾四周,PBKDF2似乎是一个不错的选择。所以我找到了这个网站,它提供了一个很好的教程,以及一个适用于PHP的PBKDF2(这是我在我的网站上使用的)。 因此,我设置了我的网站,以使用这些功能生成/创建密码,但正如您在以下代码中看到的: salt在create_散列函数中生成,并存储在生成的散列中,该散列最终看起来像
似乎可以从Android(本机)访问;但我仍在努力让这一切顺利进行。 在我的React本机应用程序中,我有如下内容: 百货商店 用户减速器 从商店获取用户 现在的问题开始时,我试图让相同的用户从Android,我所有的挫折尝试这是我有: 由于用户认为它是一个对象,我不知道这是否是获取的正确方法,我尝试获取,但没有成功。 我开始认为我应该使用react原生sqlite存储,在那里我可以知道我的数据结