使用SharedPreferences在Android存儲對象詳細代碼
為什么不用SQLite? 原因多種:除了面向?qū)ο蠛完P(guān)系數(shù)據(jù)庫之間的阻抗不匹配時,SQLite可能是矯枉過正(帶來了更多的開銷)對于一些簡單的用例,或者其用法和語句可能會完全不喜歡。其他Android ORM 框架(ORMLite, greenDAO, Sugar ORM, ActiveAndroid, 等)或NOSQL移動數(shù)據(jù)庫,如Couchbase精簡版(Beta版在此時間)。 Couchbase精簡版基本上是一個JSON數(shù)據(jù)庫,它們旨在降低復(fù)雜性,但是同時又違背了抽象漏洞定律(所有不證自明的抽象都是有漏洞的)
代碼如下:
/** stores the user object in SharedPreferences */
public class UserPrefs{
/** This application's preferences label */
private static final String PREFS_NAME = "com.our.package.UserPrefs";
/** This application's preferences */
private static SharedPreferences settings;
/** This application's settings editor*/
private static SharedPreferences.Editor editor;
/** Constructor takes an android.content.Context argument*/
public UserPrefs(Context ctx){
if(settings == null){
settings = ctx.getSharedPreferences(PREFS_NAME,
Context.MODE_PRIVATE );
}
/*
* Get a SharedPreferences editor instance.
* SharedPreferences ensures that updates are atomic
* and non-concurrent
*/
editor = settings.edit();
}
//...
}
其中User代碼如下:
/** User object to be saved in db */
public class User{
private int id; // used for object storage
private String userName;
private boolean registered;
private double score;
/** Constructor */
public User(int id, String userName, boolean registered, double score){
this.id = id;
this.userName = userName;
this.registered = registered;
this.score = score;
}
// getters and setters here...
}
將SharedPreferences看成一個Map存儲,
CRUD操作如下:
/** generic field keys */
private static final String KEY_USERNAME = "com.our.package.KEY_USERNAME";
private static final String KEY_REGISTERED = "com.our.package.KEY_REGISTERED";
private static final String KEY_SCORE = "com.our.package.KEY_SCORE";
/** Store or Update */
public void setUser(User user){
if(user == null)
return; // don't bother
int id = user.getId();
editor.putString(
getFieldKey(id, KEY_USERNAME),
user.getUsername() );
editor.putBoolean(
getFieldKey(id, KEY_REGISTERED),
user.isRegistered() );
editor.putFloat(
getFieldKey(id, KEY_SCORE),
user.getScore() );
editor.commit();
}
/** Retrieve */
public User getUser(int id){
String name = settings.getString(
getFieldKey(id, KEY_USERNAME),
"" ); // default value
boolean registered = settings.getBoolean(
getFieldKey(id, KEY_REGISTERED),
false); // default value
double score = settings.getFloat(
getFieldKey(id, KEY_SCORE),
0); // default value
return new User(id, name, registered, score);
}
/** Delete */
public void deleteUser(User user){
if(user == null)
return; // don't bother
int id = user.getId();
editor.remove( getFieldKey(id, KEY_USERNAME) );
editor.remove( getFieldKey(id, KEY_REGISTERED) );
editor.remove( getFieldKey(id, KEY_SCORE) );
editor.commit();
}
主鍵是通過getFieldKey方法, getFieldKey() 給我們每個用戶每個字段的唯一標識。
/** The prefix for flattened user keys */
public static final String KEY_PREFIX =
"com.our.package.KEY";
/** Method to return a unique key for any field belonging to a given object
* @param id of the object
* @param fieldKey of a particular field belonging to that object
* @return key String uniquely identifying the object's field
*/
private String getFieldKey(int id, String fieldKey) {
return KEY_PREFIX + id + "_" + fieldKey;
}
客戶端調(diào)用如下:
// get a SharedPreferences instance UserPrefs prefs = new UserPrefs( this.getApplicationContext() ); // get id from server or local storage // then find User with that id User user = prefs.getUser(id); // operations on User, e.g. user.setRegistered(true); user.setScore(new_score); // save prefs.setUser(user); // ...or delete prefs.deleteUser(user),
Gson
Gson 是一個Java庫,它提供了簡單的toJSON()和fromJson()方法來轉(zhuǎn)換Java對象到JSON格式,反之亦然。我們可以簡單地存儲JSON格式整個字符串到SharedPreferences:
// convert User object user to JSON format Gson gson = new Gson(); String user_json = gson.toJson(user); // store in SharedPreferences String id = "" + user.getId(); // get storage key editor.putString(id, user_json); editor.commit(); // time flies... // do the reverse operation user_json = settings.getString(id, ""); user = gson.fromJson(user_json, User.class);
到此這篇關(guān)于使用SharedPreferences在Android存儲對象詳細代碼的文章就介紹到這了,更多相關(guān)使用SharedPreferences在Android存儲對象內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android 中讀取SD卡文件時拋出NullPointerException錯誤解決辦法
這篇文章主要介紹了Android 中讀取SD卡文件時拋出NullPointerException錯誤解決辦法的相關(guān)資料,需要的朋友可以參考下2017-05-05
Android WebView的使用方法及與JS 相互調(diào)用
這篇文章主要介紹了Android WebView的使用方法及與JS 相互調(diào)用的相關(guān)資料,WebView 是 Android 中一個非常實用的組​件, WebView 可以使得網(wǎng)頁輕松的內(nèi)嵌到app里,還可以直接跟js相互調(diào)用,需要的朋友可以參考下2017-07-07

