使用SharedPreferences在Android存储对象

为什么不用SQLite? 原因多种:除了面向对象和关系数据库之间的阻抗不匹配时,SQLite可能是矫枉过正(带来了更多的开销)对于一些简单的用例,或者其用法和语句可能会完全不喜欢。其他Android ORM 框架(ORMLite, greenDAO, Sugar ORM, ActiveAndroid, 等)或NOSQL移动数据库,如Couchbase精简版(Beta版在此时间)。 Couchbase精简版基本上是一个JSON数据库,它们旨在降低复杂性,但是同时又违背了抽象漏洞定律(所有不证自明的抽象都是有漏洞的)

代码如下:

/** 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;

}

客户端调用如下:

// 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 是一个Java库,它提供了简单的toJSON()和fromJson()方法来转换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);

android 保存对象,使用sharedpreferences在Android存储对象 -解道Jdon相关推荐

  1. android 保存ArrayListObject至SharedPreferences

    今天,简单讲讲如何保持ArrayList<Object>到SharedPreferences. 之前讲了保持ArrayList<String>到SharedPreference ...

  2. html 属性存储对象,在HTML5 localStorage中存储对象

    Stringify并不能解决所有问题 似乎这里的答案并未涵盖JavaScript中可能的所有类型,因此这里有一些关于如何正确处理它们的简短示例://Objects and Arrays: var ob ...

  3. android保存字符到sd卡,android 保存TXT文件到SD卡方法

    直接贴代码吧: import java.io.*; import android.util.Log; /*将调试信息保存到sdcard上*/ public class DebugMessage { p ...

  4. python列表中存类对象_Python DataFrame或用于存储对象的列表

    一个 pandas.DataFrame将很乐意存储python对象. 一些测试代码来演示-- 测试代码: class MyPoint: def __init__(self, x, y): self._ ...

  5. 对象在内存中的存储基本类型和包装类java类型转换

    对象在内存中的存储 对象头.实例数据和填充数据(为了对齐) 实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐. 填充数据:由于虚拟机要求 ...

  6. javascript存储对象

    如何实现浏览器内多标签页之间的通信? 调用localStorage .sessionStorage .cookies本地存储方式. html5中web本地存储(缓存本地数据) Web 存储 API 提 ...

  7. android SharedPreferences 存储对象

    原文地址为: android SharedPreferences 存储对象 我们知道SharedPreferences只能保存简单类型的数据,例如,String.int等. 如果想用SharedPre ...

  8. Android基础入门教程——6.2 数据存储与访问之——SharedPreferences保存用户偏好参数

    Android基础入门教程--6.2 数据存储与访问之--SharedPreferences保存用户偏好参数 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家介绍的是第二种存储用 ...

  9. android 序列化存储对象,android中对象序列化存储

    项目中要存储一些数据为了提高不必要的网络请求,提高效率,用到数据持久化的知识点,针对这个问题,解决办法其实有很多,以前在项目中是服务获取到webservice的xml,然后直接将xml保存在本地,之后 ...

最新文章

  1. SQL2008 一直error40 无法连接到localhost
  2. Python学习笔记_读Excel去重
  3. kafka突然无法消费topic
  4. Redis 几种应用场景
  5. python代替shell脚本_python的简洁是shell无法代替的
  6. 数学怪兽-法国数学家庞加莱
  7. 基于Java+SpringBoot+vue+element实现家具购物销售网站详细设计和实现
  8. 常用MYSQL日期查询
  9. 什么是全场景AI计算框架MindSpore?
  10. overlapped重叠IO
  11. 已知原函数和导函数的关系_原函数与导函数的关系
  12. 银行卡不销卡,对持卡人有没有什么影响?
  13. 做机器学习的是些什么样的人?Kaggle做了一份居委会式的调查
  14. SQL Server 表中有重复的数据,无法对重复数据进行更新或删除。
  15. kubernetes kubeadm init kube-apiserver.yaml already exists
  16. transcad安装教程_Transcad基础视频教程
  17. win7系统删除多余的系统服务操作
  18. 浅谈学习的深度和广度
  19. 嵌入式系统是不是计算机系统,开发必知:嵌入式系统对比计算机系统
  20. 根据项目或WBS结算规则批量生成下阶WBS的结算规则-CJB2

热门文章

  1. 餐饮收银管理系统如何连接mysql_基于jsp+mysql+Spring+mybatis的SSM餐厅点餐收银管理系统...
  2. 黑莓7130G - 以惊人的特征的手机
  3. 照相机照片删除了怎么恢复?80%的人用这1个方法就解决了
  4. SQL Server Management Studio 黑色主题
  5. USB存储禁用及解禁
  6. 解锁bootloader_如何以官方方式解锁Android手机的Bootloader
  7. [多图]译稿:重装Windows,只用53款全免费软件
  8. 现场工程师出马:VMware+LVM卷快速在windows Server上部署Kafka集群
  9. Android程序开发意见反馈的实现
  10. Matlab直方图的均衡化