使用JSON和SharedPreferences存储用户自定义类
SharedPreferences可以用来永久地存储数据,即使应用被销毁。事实上数据存储在Android的内部存储器上。
有两种分方法用来获取SharedPreferences对象。 getSharedPreferences() - 当应用需要多个由名字区分的存储文件时,可以调用这个方法。getPreferences()-当应用只需要一个存储文件时,调用这个方法。
使用SharedPreferences
在SharedPreferences对象中写入数据,需要:
1.调用edit()方法获得一个SharedPreferences.Editor对象。
2.使用Editor对象的方法比如putBoolean()和putString()等将数据写入Editor。
3.使用Editor对象的方法commit()或apply()将数据提交。
读取SharedPreferences中的数据只需要调用SharedPreferences的方法如getBoolean()和getString().
@Override
protected void onCreate(Bundle state){
super.onCreate(state);
. . .
// Restore preferences
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
boolean silent = settings.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop(){
super.onStop();
// We need an Editor object to make preference changes.
// All objects are from android.context.Context
SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Commit the edits!
editor.commit();
}
SharedPreferences的局限性在于只能存储基本类型:boolean,float,short,int,long,string等。
如何改造让他可以存数组:
SharedPreferences
<?xml version="1.0" encoding="utf-8"?>
<map>
<boolean name="com.android.inputmethod.latin/.LatinIME" value="true"/>
<boolean name="sound_effects" value="true"/>
<string name="hdcp_checking">drm-only</string>
<string name="font_size">1.0</string>
<boolean name="lock_sounds" value="true"/>
<boolean name="allow_mock_location" value="true"/>
<boolean name="haptic_feedback" value="true"/>
<boolean name="keep_screen_on" value="true"/>
<boolean name="dtmf_tone" value="true"/>
</map>
通过改造实现shareprefernces存储list数据
public List<String> getINfo() {
List<String> list=new ArrayList<String>();
int size=sp.getInt(HISTORY_SIZE,0);
for (int i = 0; i <size ; i++) {
list.add(sp.getString(HISTORY+i,null));
}
return list;
}
public void SaveInfo( List<String> list){
sp.putInt(HISTORY_SIZE,list.size());
for (int i = 0; i <list.size() ; i++) {
sp.remove(HISTORY+i);
sp.putString(HISTORY+i,list.get(i));
}
}
上面是个list数据,如果数据是List,可能就比较复杂了。
我们就需要另外一个工具,名叫json。
类似 XML
JSON 是纯文本
JSON 具有“自我描述性”(人类可读)
JSON 具有层级结构(值中存在值)
String的最大长度是
json简单语法
JSON 语法是 JavaScript 对象表示法语法的子集。
数据在名称/值对中 “城市”:“北京”
数据由逗号分隔
花括号保存对象 {“城市”:“北京”,“户籍”:“南京”}
方括号保存数组 {“employees”:[{“name”:“jack”,“age”:“13”},{“name”:“mina”,“age”:“15”}]}
Gson 谷歌用来解析json数据的java包
//需要存储的list
User user1 = new User("jack", "123456789", "http://www.hello.com/1.png");
User user2 = new User("tom", "45467956456", "http://www.hello.com/2.png");
User user3 = new User("lily", "65465897faf", "http://www.hello.com/3.png");
ArrayList<User> users = new ArrayList<>();
users.add(user1);
users.add(user2);
users.add(user3);
存储方法
Gson gson = new Gson();
//list转换为json(string)
String jsonStr = gson.toJson(users);
sp.put(mContext, "USERS_KEY", jsonStr);
取出方法
String str = (String) SPUtils.get(mContext, "USERS_KEY", "");
users = gson.fromJson(str, new TypeToken<List<User>>() {}.getType());
for (User user : users) {
if (user.getUsername().equals("jack")) {
L.d(user.getProfile_pic());
}
}