使用SharedPreferences在Android存储对象详细代码

作者:banq 时间:2022-06-14 12:50:29 

为什么不用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

标签:SharedPreferences,Android,存储,对象
0
投稿

猜你喜欢

  • C#设计模式之Singleton模式

    2022-03-28 09:01:31
  • c# 解决IIS写Excel的权限问题

    2021-08-21 03:23:34
  • 聊一聊jdk1.8中的ArrayList 底层数组是如何扩容的

    2023-11-16 08:55:50
  • Java实现注册登录与邮箱发送账号验证激活功能

    2023-11-05 09:21:57
  • @RequestBody的使用案例代码

    2021-07-11 16:46:50
  • Spring Cloud Gateway替代zuul作为API网关的方法

    2023-05-03 07:19:58
  • Android 图片缩放与旋转的实现详解

    2023-03-10 10:57:41
  • C#实现将应用程序设置为开机启动的方法

    2023-06-04 05:59:26
  • 在idea中使用JaCoCo插件统计单元测试覆盖率的实现

    2022-12-27 12:31:28
  • JDK动态代理,代理接口没有实现类,实现动态代理方式

    2021-12-21 11:55:22
  • Java集合之Set接口及其实现类精解

    2022-01-23 17:27:44
  • android中RecycleView添加下滑到底部的监听示例

    2022-06-21 17:02:08
  • Mybatis 如何传入字符串参数,分割并遍历

    2021-10-08 01:14:45
  • Java新API的时间格式化

    2023-02-14 19:24:37
  • C#将PPT文件转换成PDF文件

    2022-09-08 20:33:21
  • Java毕业设计实战之教室预订管理系统的实现

    2023-03-03 20:38:11
  • java方法重写实例分析

    2022-01-10 02:51:14
  • android简易文件管理器实例(列表式文件目录)

    2021-07-28 09:43:30
  • 非常实用的小功能 Android应用版本的更新实例

    2023-10-28 03:41:51
  • C#实现将聊天数据发送加密

    2022-09-10 05:56:35
  • asp之家 软件编程 m.aspxhome.com