1. 程式人生 > >SharedPreferences中儲存bean類集合或者儲存bean類

SharedPreferences中儲存bean類集合或者儲存bean類

儲存List資料到本地的常用方式一般是用sqlite,但是如果不想用sqlite,或者資料量很少,使用SharedPreferences也是一種不錯的選擇。

本案例需要注意兩點

  • 此Demo的json解析使用的是fastjson , 使用demo中的方法之前一定要新增fastjson 依賴 , fastjson 教程可以參考:https://github.com/alibaba/fastjson
  • 這個需要特別注意 , 本人踩的坑 . 實體類需要有一個空的建構函式 , 否則會報錯: com.alibaba.fastjson.JSONException: default constructor not
    found……

有錯誤的地方請指正 , 大家多多交流.

程式碼如下

MainActivity類程式碼:

package com.example.li_yx.spdemo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.Button;

import com.alibaba.fastjson.JSON;

import java.util.ArrayList;
import
java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button mSaveBeanList; private Button mGetBeanList; private ArrayList<Teacher> mTeachers; private Button mGetBean; private Button mSaveBean; @Override protected
void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mSaveBeanList = findViewById(R.id.saveBeanList); mGetBeanList = findViewById(R.id.getBeanList); mGetBean = findViewById(R.id.getBean); mSaveBean = findViewById(R.id.saveBean); initData(); mSaveBeanList.setOnClickListener(this); mGetBeanList.setOnClickListener(this); mSaveBean.setOnClickListener(this); mGetBean.setOnClickListener(this); } private void initData() { mTeachers = new ArrayList<>(); ArrayList<Student> students = new ArrayList<>(); Student studentone = new Student("student_one", 12); Student studenttwo = new Student("student_two", 15); students.add(studentone); students.add(studenttwo); Teacher teacher1 = new Teacher("ljl", 27, students); Teacher teacher2 = new Teacher("lyx", 22, students); mTeachers.add(teacher1); mTeachers.add(teacher2); } @Override public void onClick(View v) { int id = v.getId(); switch (id) { case R.id.saveBeanList: saveBeanList(); break; case R.id.getBeanList: getBeanList(); break; case R.id.saveBean: saveBean(); break; case R.id.getBean: getBean(); break; default: break; } } private void saveBean() { Student student = new Student("羅輯", 32); String str = JSON.toJSONString(student); CtsSPUtil.put(MainActivity.this, "TestTwo", str); } public void getBean() { String testTwo = (String) CtsSPUtil.get(MainActivity.this, "TestTwo", ""); Student student = parseObject(testTwo, Student.class); System.out.println(student); } private void saveBeanList() { String str = JSON.toJSONString(mTeachers); CtsSPUtil.put(MainActivity.this, "TestOne", str); } public void getBeanList() { String testOne = (String) CtsSPUtil.get(MainActivity.this, "TestOne", ""); List<Teacher> teachers = parseArray(testOne, Teacher.class); System.out.println(teachers.size()); } public static <T> List<T> parseArray(String jsonString, Class<T> clazz) { if (TextUtils.isEmpty(jsonString)) return null; return JSON.parseArray(jsonString, clazz); } public static <T> T parseObject(String jsonString, Class<T> clazz) { if (TextUtils.isEmpty(jsonString)) return null; return JSON.parseObject(jsonString, clazz); } }

CtsSPUtil工具類:

package com.example.li_yx.spdemo;

import android.content.Context;
import android.content.SharedPreferences;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Map;

public class CtsSPUtil {

    /**
     * 儲存在手機裡面的檔名
     */
    public static final String FILE_NAME = "cts_sp_data";

    /**
     * 儲存資料的方法,我們需要拿到儲存資料的具體型別,然後根據型別呼叫不同的儲存方法
     */
    public static void put(Context context, String key, Object object) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        if (object instanceof String) {
            editor.putString(key, (String) object);
        } else if (object instanceof Integer) {
            editor.putInt(key, (Integer) object);
        } else if (object instanceof Boolean) {
            editor.putBoolean(key, (Boolean) object);
        } else if (object instanceof Float) {
            editor.putFloat(key, (Float) object);
        } else if (object instanceof Long) {
            editor.putLong(key, (Long) object);
        } else {
            editor.putString(key, object.toString());
        }
        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 得到儲存資料的方法,我們根據預設值得到儲存的資料的具體型別,然後呼叫相對於的方法獲取值
     */
    public static Object get(Context context, String key, Object defaultObject) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        if (defaultObject instanceof String) {
            return sp.getString(key, (String) defaultObject);
        } else if (defaultObject instanceof Integer) {
            return sp.getInt(key, (Integer) defaultObject);
        } else if (defaultObject instanceof Boolean) {
            return sp.getBoolean(key, (Boolean) defaultObject);
        } else if (defaultObject instanceof Float) {
            return sp.getFloat(key, (Float) defaultObject);
        } else if (defaultObject instanceof Long) {
            return sp.getLong(key, (Long) defaultObject);
        }
        return null;
    }

    /**
     * 移除某個key值已經對應的值
     */
    public static void remove(Context context, String key) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.remove(key);
        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 清除所有資料
     */
    public static void clear(Context context) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        SharedPreferences.Editor editor = sp.edit();
        editor.clear();
        SharedPreferencesCompat.apply(editor);
    }

    /**
     * 查詢某個key是否已經存在   
     */
    public static boolean contains(Context context, String key) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        return sp.contains(key);
    }

    /**
     * 返回所有的鍵值對   
     */
    public static Map<String, ?> getAll(Context context) {
        SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
        return sp.getAll();
    }

    /**
     * 建立一個解決SharedPreferencesCompat.apply方法的一個相容類
     */
    private static class SharedPreferencesCompat {

        private static final Method sApplyMethod = findApplyMethod();

        /**
         * 反射查詢apply的方法
         */
        @SuppressWarnings({"unchecked", "rawtypes"})
        private static Method findApplyMethod() {
            try {
                Class clz = SharedPreferences.Editor.class;
                return clz.getMethod("apply");
            } catch (NoSuchMethodException e) {
            }
            return null;
        }

        /**
         * 如果找到則使用apply執行,否則使用commit    
         */
        public static void apply(SharedPreferences.Editor editor) {
            try {
                if (sApplyMethod != null) {
                    sApplyMethod.invoke(editor);
                    return;
                }
            } catch (IllegalArgumentException e) {
            } catch (IllegalAccessException e) {
            } catch (InvocationTargetException e) {
            }
            editor.commit();
        }

    }

}

Teacher類:

package com.example.li_yx.spdemo;

import java.util.ArrayList;

public class Teacher {

    private String name;
    private int age;
    private ArrayList<Student> mStudents;

    public Teacher(){}

    public Teacher(String name, int age, ArrayList<Student> students) {
        this.name = name;
        this.age = age;
        mStudents = students;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public ArrayList<Student> getStudents() {
        return mStudents;
    }

    public void setStudents(ArrayList<Student> students) {
        mStudents = students;
    }
}

Student類:

package com.example.li_yx.spdemo;

public class Student {

    private String name;
    private int age;

    public Student(){}

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

相關推薦

SharedPreferences儲存bean集合或者儲存bean

儲存List資料到本地的常用方式一般是用sqlite,但是如果不想用sqlite,或者資料量很少,使用SharedPreferences也是一種不錯的選擇。 本案例需要注意兩點 此Demo的json解析使用的是fastjson , 使用demo中

BOS新增欄位後關於儲存不上值或者儲存後顯出不出數

儲存欄位的資料時會呼叫storeFields() 儲存後會又呼叫loadFields(),其中getSelectors()方法中負責Query資料。 即新增欄位後,如果出現問題,則去繼承父類的這3個方法進行重寫。 例: public void loadFields() {

java集合框架容器 java框架層級 繼承圖結構 集合框架的抽象 集合框架主要實現

本文關鍵詞: java集合框架  框架設計理念  容器 繼承層級結構 繼承圖 集合框架中的抽象類  主要的實現類 實現類特性   集合框架分類 集合框架併發包 併發實現類 什麼是容器? 由一個或多個確定的元素所構成的整體叫做集合。 容器用來包裝或裝載物品的貯存器   (如箱、罐、壇)或者成形或柔軟

27-集合--Set及其子(HashSet+LinkedHashSet+TreeSet)+二叉樹+Comparable+Comparator+雜湊表+HashSet儲存自定義物件+判斷元素唯一的方式

一、Set 1、Set:元素不可以重複,是無序的(存入和取出的順序不一致) 2、Set介面中的方法和Collection中的方法一致 3、Set集合的元素取出方式只有一種:迭代器iterator() Set set = new HashSet(); I

使用nginx image filter實現OSS物件儲存對圖片的實時處理

使用Nginx image_filter實現類似OSS圖片處理 在家使用自己的電腦做了一個小應用,可檢視照片,按以前的方式,需要在使用者上傳圖片後對進行裁剪壓縮,然後給前段一個縮圖地址與原圖地址。這種方式有兩個弊端磁碟空間的浪費、縮圖尺寸調整不便捷。是否有其他不使用雲OSS儲存的情況下自己實現一

Map 集合 K/V儲存 null 值情況

摘自阿里的《Java開發手冊》 【推薦】高度注意 Map 類集合 K/V 能不能儲存 null 值的情況,如下表格: Hashtable 不允許為 null 不允許為 null Dictionary 執行緒安全

集合集合_儲存和遍歷(增強型for迴圈和迭代器)

package GuanQia3_test2_集合中套集合_第一次沒想明白; /* * 一個學科中有若干班級,每一個班級又有若干學生。整個學科一個大集合, * 若干個班級分為每一個小集合(集合巢狀之HashSet巢狀HashSet)。要求如下 * 1、 學生類有兩個屬

List集合迴圈儲存物件時,導致迴圈後集閤全部資料都是最後一條的情況

在處理資料,List集合迴圈儲存物件時,發現迴圈後集閤中全部資料都是最後一條的情況。 code: ... AlarmInfo ai = new AlarmInfo(); //建立物件 List

MFC關於檔案的讀取和儲存(使用CFile與CFileDialog

       CFile::modeCreate 構造新檔案,如果檔案存在,則長度變為0        CFile::modeNoTruncate 該屬性和modeCreate聯合使用,可以達到如下效果:如果檔案存在,則不會將檔案的長度置為0,如果不存在,則會由modeCreate屬性來建立一個新檔案。  

J2ee專案從0搭建(十一):在專案整合Redis,用於資料的儲存或者快取

一、Redis安裝 已經安裝好redis的可以直接進入下一步,沒有的可以先進行安裝:Linux(CentOS 7)Redis 安裝 二、pom依賴: Jedis是redis的java版本的客戶端實現 <dependency> <group

黑馬程式設計師—集合將自定義物件作為元素儲存到ArrayList集合,並去除重複元素。 比如:存人物件。同姓名同年齡,視為同一個人,為重複元素。

package fourteen; import java.util.*; public class eleven {/**將自定義物件作為元素儲存到ArrayList集合中,並去除重複元素。比如:存人物件。同姓名同年齡,視為同一個人,為重複元素。思路:1.對人描述,將資料封裝儘速物件。2.定義容器將人存入。

SharedPreferences的操作儲存和獲取更簡單,本單例

<span style="font-size:18px;">public class SPUtils { // private static UserSP instance; public static SharedPreferences sp; pu

Matlab對影象應用plot或者rectangle後的影象儲存問題

我們處理好影象後,為了標識出影象的目標區域來,需要利用plot函式或者rectangle函式,這樣標識目標後,就儲存影象。一般的儲存影象可以利用figure中的edit選單中的copy figure,這樣可以完成,但是儲存後的影象外圍多了一片區域,這是figure的區域,

Java集合框架篇-59-TreeSet儲存基本資料型別和自定義物件

      這篇開始,我們來學習Set介面的另外一個實現子類TreeSet。TreeSet一般是需要排序才使用的一種集合儲存方式,由於繼承了Set介面,TreeSet也能實現元素的唯一。下面通過兩個練習

檢視SharedPreferences儲存的資料

        Android開發中一般都是將配置檔案儲存至 SharedPreferences 中,除了使用 getString 等方法獲取儲存的值之外有什麼辦法可以直觀的看到所儲存的值呢? 答案是使用 adb 工具。 步驟: 一、開啟命令提示符(W

ArrayList集合的字串資料儲存到文字檔案|文字檔案讀取資料到集合

package cn.itcast_02; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; /

Java最常用的集合框架之 HashMap

tor nbsp 兩種 lca 元素 adf boolean 線程 進行 一、HashMap的概述 HashMap可以說是Java中最常用的集合類框架之一,是Java語言中非常典型的數據結構。 HashMap是基於哈希表的Map接口實現的,此實現

SpringIOC容器對數組,集合的相關bean的裝配

art prop emp pri val 對數 try ioc容器 blog <bean id="department" class="com.pojo.Department"> <property name="name" val

淺談JAVA字符串常量的儲存位置

數據 每一個 [] jit 返回 inf post 符號 boolean 在講述這些之前我們需要一些預備知識: Java的內存結構我們可以通過兩個方面去看待它。 一、從抽象的JVM的角度去看。相關定義請參考JVM規範:Chapter 2. The Structure o

扒一扒系列之開發常用的Java集合(ArrayList篇 jdk 1.7)

mda des obj 初始設置 onu util private 內部 會有 關於這個系列,因為開發主要用的是java語言,一直想寫寫java開發中常用的一些類(雖然這才是開始的第三篇>_<),所有就起了“扒一扒”系列。這個系列會有框架