android 保存对象,使用sharedpreferences在Android存储对象 -解道Jdon
使用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相关推荐
- android 保存ArrayListObject至SharedPreferences
今天,简单讲讲如何保持ArrayList<Object>到SharedPreferences. 之前讲了保持ArrayList<String>到SharedPreference ...
- html 属性存储对象,在HTML5 localStorage中存储对象
Stringify并不能解决所有问题 似乎这里的答案并未涵盖JavaScript中可能的所有类型,因此这里有一些关于如何正确处理它们的简短示例://Objects and Arrays: var ob ...
- android保存字符到sd卡,android 保存TXT文件到SD卡方法
直接贴代码吧: import java.io.*; import android.util.Log; /*将调试信息保存到sdcard上*/ public class DebugMessage { p ...
- python列表中存类对象_Python DataFrame或用于存储对象的列表
一个 pandas.DataFrame将很乐意存储python对象. 一些测试代码来演示-- 测试代码: class MyPoint: def __init__(self, x, y): self._ ...
- 对象在内存中的存储基本类型和包装类java类型转换
对象在内存中的存储 对象头.实例数据和填充数据(为了对齐) 实例变量:存放类的属性数据信息,包括父类的属性信息,如果是数组的实例部分还包括数组的长度,这部分内存按4字节对齐. 填充数据:由于虚拟机要求 ...
- javascript存储对象
如何实现浏览器内多标签页之间的通信? 调用localStorage .sessionStorage .cookies本地存储方式. html5中web本地存储(缓存本地数据) Web 存储 API 提 ...
- android SharedPreferences 存储对象
原文地址为: android SharedPreferences 存储对象 我们知道SharedPreferences只能保存简单类型的数据,例如,String.int等. 如果想用SharedPre ...
- Android基础入门教程——6.2 数据存储与访问之——SharedPreferences保存用户偏好参数
Android基础入门教程--6.2 数据存储与访问之--SharedPreferences保存用户偏好参数 标签(空格分隔): Android基础入门教程 本节引言: 本节给大家介绍的是第二种存储用 ...
- android 序列化存储对象,android中对象序列化存储
项目中要存储一些数据为了提高不必要的网络请求,提高效率,用到数据持久化的知识点,针对这个问题,解决办法其实有很多,以前在项目中是服务获取到webservice的xml,然后直接将xml保存在本地,之后 ...
最新文章
- SQL2008 一直error40 无法连接到localhost
- Python学习笔记_读Excel去重
- kafka突然无法消费topic
- Redis 几种应用场景
- python代替shell脚本_python的简洁是shell无法代替的
- 数学怪兽-法国数学家庞加莱
- 基于Java+SpringBoot+vue+element实现家具购物销售网站详细设计和实现
- 常用MYSQL日期查询
- 什么是全场景AI计算框架MindSpore?
- overlapped重叠IO
- 已知原函数和导函数的关系_原函数与导函数的关系
- 银行卡不销卡,对持卡人有没有什么影响?
- 做机器学习的是些什么样的人?Kaggle做了一份居委会式的调查
- SQL Server 表中有重复的数据,无法对重复数据进行更新或删除。
- kubernetes kubeadm init kube-apiserver.yaml already exists
- transcad安装教程_Transcad基础视频教程
- win7系统删除多余的系统服务操作
- 浅谈学习的深度和广度
- 嵌入式系统是不是计算机系统,开发必知:嵌入式系统对比计算机系统
- 根据项目或WBS结算规则批量生成下阶WBS的结算规则-CJB2
热门文章
- 餐饮收银管理系统如何连接mysql_基于jsp+mysql+Spring+mybatis的SSM餐厅点餐收银管理系统...
- 黑莓7130G - 以惊人的特征的手机
- 照相机照片删除了怎么恢复?80%的人用这1个方法就解决了
- SQL Server Management Studio 黑色主题
- USB存储禁用及解禁
- 解锁bootloader_如何以官方方式解锁Android手机的Bootloader
- [多图]译稿:重装Windows,只用53款全免费软件
- 现场工程师出马:VMware+LVM卷快速在windows Server上部署Kafka集群
- Android程序开发意见反馈的实现
- Matlab直方图的均衡化