[Android] 使用JSON和SharedPreferences存储用户自定义类

先看一下Google官方对于SharedPreferences的定义:

The SharedPreferences class provides a general framework that allows you to save and retrieve persistent key-value pairs of primitive data types. You can use SharedPreferences to save any primitive data: booleans, floats, ints, longs, and strings. This data will persist across user sessions (even if your application is killed).

SharedPreferences可以用来永久地存储数据,即使应用被销毁。事实上数据存储在Android的内部存储器上。

有两种分方法用来获取SharedPreferences对象。 getSharedPreferences() - 当应用需要多个由名字区分的存储文件时,可以调用这个方法。getPreferences()-当应用只需要一个存储文件时,调用这个方法。

在SharedPreferences对象中写入数据,需要:

1.调用edit()方法获得一个SharedPreferences.Editor对象。

2.使用Editor对象的方法比如putBoolean()和putString()等将数据写入Editor。

3.使用Editor对象的方法commit()或apply()将数据提交。

读取SharedPreferences中的数据只需要调用SharedPreferences的方法如getBoolean()和getString().

下面是一个使用SharedPreferences存储数据的例子。

public class Calc extends Activity {
    public static final String PREFS_NAME = "MyPrefsFile";

    @Override
    protected void onCreate(Bundle state){
       super.onCreate(state);
       . . .

       // Restore preferences
       SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
       boolean silent = settings.getBoolean("silentMode", false);
       setSilent(silent);
    }

    @Override
    protected void onStop(){
       super.onStop();

      // We need an Editor object to make preference changes.
      // All objects are from android.context.Context
      SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0);
      SharedPreferences.Editor editor = settings.edit();
      editor.putBoolean("silentMode", mSilentMode);

      // Commit the edits!
      editor.commit();
    }
}

从Google的介绍中可以看到,SharedPreferences的局限性在于只能存储基本类型:boolean,floot,short,int,long,string等。对于用户自定义的类型,通常由多个基本类型数据和数组组成。比如这样一个自定义类型:

public class Action {
    // Action Data
    private UUID id;
    private Date start;private String actionName;
    private int alarmingHour=0;private String[] records = new String[100];
}

这时候就不能使用SharedPreferences来存储。

这个时候就需要另一个主角 :JSON.

JSON的全称是JavaScript对象表示法,是存储和交换文本信息的语法,类似 XML,实现了对象与文本之间的转化。

在Android中内置了JSONObject和JSONArray.

对于这样一个用户自定义类型,可以通过

    /**
     * transform the Action instance to JSONObject,and then save JSONObject.toString()
     * to SharedPreference.
     * @return the JSONObject corresponding to the Action
     * @throws JSONException
     */
    public JSONObject toJSON() throws JSONException{
        JSONObject json = new JSONObject();
        json.put(JSON_id,id.toString());
        json.put(JSON_startDate, start.getTime());
        JSONArray array = new JSONArray();
        JSONObject JSONRecords[] = new JSONObject[length];
        for(int i = 0; i<length;i++){
            JSONRecords[i] = new JSONObject();
            JSONRecords[i].put(JSON_record, records[i].getRecord());
            array.put(i,JSONRecords[i]);
        }
        json.put(JSON_dailyRecords,array);
        return json;
    }

/**
     * get the Action from JSONObject
     * @param jsonString the jsonString retrieved from SharedPreference.
     * @return the Action stored in JSONObject
     * @throws JSONException
     */
    public static Action parseJSONString(String jsonString) throws JSONException{
        JSONObject json;
        json = new JSONObject(jsonString);
        UUID id = UUID.fromString(json.getString(JSON_id));
        Date start = new Date(json.getLong(JSON_startDate));
        String actionName = json.getString(JSON_name);
        String[] dailyRecords = new DailyRecord[100];
        for (int i = 0; i<100;i++){
            JSONObject json_record = array.getJSONObject(i);
            String record = json_record.getString(JSON_record);
            dailyRecords[i] = record;
        }
        return new Action(id,start,actionName,dailyRecords);
    }

来实现Action和JSONObject之间的转换,JSONObject实际是是文本的形式,可以很方便地转化为String,因此使用SharedPreferences来存储转换之后的String就可以实现Action的存储。

SharedPreferences sp =getSharedPreferences(Config.CurrentAction, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
try {
    editor.putString(Config.CurrentActionDetails, currentAction.toJSON().toString());
} catch (JSONException e) {
    e.printStackTrace();
}
editor.apply();

从SharedPreferences中读取Action可以这样做:

try {
                SharedPreferences sp = getSharedPreferences(Config.CurrentAction, Context.MODE_PRIVATE);
                String jsonString = sp.getString(Config.CurrentActionDetails, "");
                currentAction = Action.parseJSONString(jsonString);
            } catch (JSONException e) {
                e.printStackTrace();
            }

这样就实现了用户自定义类Action的本地存储与读取。

时间: 2024-10-07 22:02:29

[Android] 使用JSON和SharedPreferences存储用户自定义类的相关文章

小白学习Android MVP和SharedPreferences存储JSONArray

以前大家开发android应用用的都是MVC,但是会感觉到M和V在Activity中的频繁交互使得代码变得臃肿,代码行数 很容易达到上千行.不仅如此,MVC的使用使得代码得可阅读性和可维护性已经可扩展性非常低,一些小功能的增加. 删除.修改和查询非常艰难,尤其是代码转接给别人维护时. MVP模式的出现很好地解决了这些问题,你会发现用了MVP模式以后,再也不想用MVC模式了.MVP模式的代码包结 构如图: M层的接口写未实现的逻辑方法,用M层的实现类来实现所有的逻辑方法:V层的接口写未实现的界面交

Android SharedPreferences存储

一 概念 SharedPreferences存储方式是Android中存储轻量级数据的一种方式.SharedPreferences存储主要用来存储一些简单的配置信息,内部以Map方式进行存储,因此需要使用键值对提交和保存数据,保存的数据以xml格式存放在本地的/data/data/<package name>/shares_prefs文件夹下. 二 特点 1,        使用简单,便于存储轻量级的数据: 2,        只支持Java基本数据类型,不支持自定义数据类型: 3,     

Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File (一) —— 总览

Android数据的四种存储方式SharedPreferences.SQLite.Content Provider和File (一) —— 总览 作为一个完成的应用程序,数据存储操作是必不可少的.因此,Android系统一共提供了四种数据存储方式.分别是:SharePreference.SQLite.Content Provider和File.由于Android系统中,数据基本都是私有的的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Pro

Android入门(九)文件存储与SharedPreferences存储

原文链接:http://www.orlion.ga/578/ Android系统中主要提供了三种方式用于简单地实现数据持久化功能,即文件存储.SharedPreference存储以及数据库存储.当然,除了这三种方式之外,你还可以将数据保存在手机的 SD卡中,不过使用文件.SharedPreference或数据库来保存数据会相 对更简单一些,而且比起将数据保存在 SD卡中会更加的安全 一.文件存储 1.将数据存储到文件中 Context类中提供了一个 openFileOutput ()方法,可以用

Android——配置文件的保存SharedPreferences进行数据存储

很多时候我们开发的软件需要向用户提供软件参数设置功能,例如我们常用的QQ,用户可以设置是否允许陌生人添加自己为好友.对于软件配置参数的保存,如果是window软件通常我们会采用ini文件进行保存,如果是j2se应用,我们会采用properties属性文件或者xml进行保存.如果是Android应用,我们最适合采用什么方式保存软件配置参数呢?Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数.使用SharedPreferen

Android——数据存储(课堂代码整理:SharedPreferences存储和手机内部文件存储)

layout文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:tools="http://schemas.android.com/tools" 4 android:layout_width="ma

Android数据的四种存储方式SharedPreferences、SQLite、Content Provider和File 之 —— SQLite

本文在http://www.cnblogs.com/wisekingokok/archive/2011/09/14/2174844.html 基础上写了一个进阶的创建方式,技术能用新的就用新的. 参考了http://blog.csdn.net/liuhe688/article/details/6715983.仅供学习参考 SQLite是一种转为嵌入式设备设计的轻型数据库,其只有五种数据类型,分别是: NULL: 空值 INTEGER: 整数 REAL: 浮点数 TEXT: 字符串 BLOB: 大

【Mark】Android应用开发SharedPreferences存储数据的使用方法

Android应用开发SharedPreferences存储数据的使用方法 SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来存储一些轻量级的数据. 1.使用SharedPreferences保存数据方法如下: //实例化SharedPreferences对象(第一步) SharedPreferences mySharedPreferences=

Android开发手记(16) 数据存储一 SharedPreferences

SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来存储一些轻量级的数据.这类似于C++中Map的数据存储方式(实际上在最后生成的.xml文件内,就是以Map格式存储的). 获取SharedPreferences的两种方式: 1.调用Context对象的getSharedPreferences()方法 2.调用Activity对象的getPrefer