使用SharedPreferences在Android存储对象详细代码
作者:banq 发布时间:2022-06-14 12:50:29
标签: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
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);
来源:https://www.jdon.com/android/sharedpreferences.html
0
投稿
猜你喜欢
- 因为工作原因需要读取json文件,最先是使用url方式不符合要求pass。又使用本地方式读取。记录一下方便后期查看。 注:因为资料都是从网上
- 依赖倒置原则(DIP)定义:高层模块不应该依赖低层模块,二者都应该依赖其抽象;抽象不应该依赖细节;细节应该依赖抽象。问题由来:类A直接依赖类
- Java 中HttpURLConnection附件上传的实例详解整合了一个自己写的采用Http做附件上传的工具,分享一下!示例代码:/**
- 在java中,可以根据Class类的对象,知道某个类(接口)的一些属性(成员 ,方法,注释,注解)等。由于最近的工作中用到了这些,其中需要在
- 如下所示:import java.util.ArrayList;import com.heima.bean.Person;public cl
- 本文实例为大家分享了C#实现简单点餐系统的具体代码,供大家参考,具体内容如下实现简单点餐系统剖析1、设计界面(给菜品的序号(index),名
- Android:4.4.4一、应用场景在Android设备上,现在我们外接了一个USB转串口的设备,设备节点是/dev/ttyUSB0:#
- Java与Oracle实现事务(JDBC事务)实例详解J2EE支持JDBC事务、JTA事务和容器事务事务,这里说一下怎样实现JDBC事务。&
- 注:由于工作需要, 也是第一次接触到打印机的相关内容, 凑巧, 通过找了很多资料和帮助后, 也顺利的解决了打印标签的问题(标签的表面信息[二
- 在进行winform开发过程中有时候会需要关闭其他程序或者关闭进程,以前写过一篇相关介绍的文章,今天有同事问起来,于是在次翻出来和大家分享一
- 本文实例讲述了Android编程基于重力传感器实现横竖屏放向切换功能。分享给大家供大家参考,具体如下:最近项目中用到了vr视频播放,因为自己
- 一、堆的创建1、向下调整(以小堆为例) 让parent标记需要调整的节点,child标记parent的左孩子(注意:parent
- 本文实例展示了DevExpress实现GridView当无数据行时提示消息的方法,具体步骤如下:主要功能代码部分如下:/// <sum
- 前言SPI 全称为 Service Provider Interface,是一种服务发现机制。SPI 的本质是将接口实现类的全限定名配置在文
- java读取文件内容,解析Json格式数据一、读取txt文件内容(Json格式数据) public static
- 互连网早期的时候,主机间的互连使用的是NCP协议。这种协议本身有很多缺陷,如:不能互连不同的主机,不能互连不同的操作系统,没有纠错功能。为了
- 前言已经有两个月没有更新博客了,其实这篇文章我早在两个月前就写好了,一直保存在草稿箱里没有发布出来。原因是有一些原理性的东西还没了解清楚,最
- 本文实例为大家分享了java根据网络地址保存图片的具体代码,供大家参考,具体内容如下import java.io.BufferedInput
- 问题当我们数据库中的字段和实体类中的字段不一致的时候,查询会出问题数据库字段是 pwdid name pwd1 张三 1234562 李四
- paras.xml文件<?xml version="1.0" encoding="UTF-8"