1. 程式人生 > >Android-儲存:SharedPreferences使用及其儲存型別

Android-儲存:SharedPreferences使用及其儲存型別

日常開發中我們常常要用到儲存資料,Android中常用的儲存方式有SQLite,sharedPreferences 等,當然也有各自的應用場景,前者適用於儲存較多資料的情形,後者責傾向於儲存使用者偏好設定比如某個checkbox的選擇狀態,使用者登入的狀態、配置資訊,實現記住密碼功能等等,都是以鍵值對的形式進行的檔案讀取。

但是每儲存一個數據都要提供一個key,如果要儲存多個數據那豈不是要寫多個key?例如我們要儲存一個使用者的登入資訊,比如使用者暱稱,個性簽名,登入時間………尼瑪我一條資料寫一個的話我都可以玩一盤擼啊擼了~反正我是受不了~那麼我們能否將使用者資訊封裝起來,統一以一個key來儲存呢?答案是肯定可以的~
Java類庫中提供的位元組輸入輸出流可以輕鬆幫我們完成任意型別到String的可逆轉換,繼而我們就可以儲存到Share中了~

SharedPreferences只能儲存簡單型別的資料,例如四種基本型別(int,float,long,boolean)+String。如果需要存取比較複雜的資料型別比如類或者影象,則需要對這些資料進行編碼,通常將其轉換成Base64編碼,然後將轉換後的資料以字串的形式儲存在XML檔案中。

這裡寫圖片描述

簡單使用:

可儲存的型別:
string,int,float,long,boolean

        //獲取sharedPreferences物件
        SharedPreferences sharedPreferences = getSharedPreferences("zjl"
, Context.MODE_PRIVATE); //獲取editor物件 SharedPreferences.Editor editor = sharedPreferences.edit();//獲取編輯器 //儲存鍵值對 editor.putString("name", "周杰倫"); editor.putInt("age", 24); editor.putBoolean("isMarried", false); editor.putLong("height", 175L); editor
.putFloat("weight", 60f); editor.putStringSet("where", set); //提交 editor.commit();//提交修改 SharedPreferences sharedPreferences = getSharedPreferences("zjl", Context.MODE_PRIVATE); //getString()第二個引數為預設值,如果preference中不存在該key,將返回預設值 String name = sharedPreferences.getString("name", ""); int age = sharedPreferences.getInt("age", 1);

儲存物件:

方法一:fastJson/Gson/Jackson將物件轉換成字串,然後再儲存。
方法二:ObjectOutputStream將物件轉化成流,base64將流轉成字串,然後再儲存。

package com.example.draggridview;

/**
 * Created by Administrator on 2017/6/19.
 */

import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.util.Base64;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * SharedPreferences工具類,可以儲存object物件
 */
public class SharedPreferenceUtil {

    /**
     * 存放實體類以及任意型別
     *
     * @param context 上下文物件
     * @param key
     * @param obj
     */
    public static void putBean(Context context, String key, Object obj) {
        if (obj instanceof Serializable) {// obj必須實現Serializable介面,否則會出問題
            try {
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                ObjectOutputStream oos = new ObjectOutputStream(baos);
                oos.writeObject(obj);
                String string64 = new String(Base64.encode(baos.toByteArray(), 0));
                SharedPreferences.Editor editor = getSharedPreferences(context).edit();
                editor.putString(key, string64).commit();
            } catch (IOException e) {
                e.printStackTrace();
            }

        } else {
            throw new IllegalArgumentException("the obj must implement Serializble");
        }

    }

    public static Object getBean(Context context, String key) {
        Object obj = null;
        try {
            String base64 = getSharedPreferences(context).getString(key, "");
            if (base64.equals("")) {
                return null;
            }
            byte[] base64Bytes = Base64.decode(base64.getBytes(), 1);
            ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
            ObjectInputStream ois = new ObjectInputStream(bais);
            obj = ois.readObject();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return obj;
    }

}

參考:

AIDL支援的資料型別

  1. 所有基礎型別(byte/short/int/long/float/double/boolean/char 等)
  2. String,List,Map,CharSequence等類
  3. 其他AIDL介面型別
  4. 所有Parcelable的類

bundle可傳遞資料型別:

1、byte/short/int/long/float/double/boolean/char等八種基本型別或它們對應的陣列,
2、String、charsequence或對應的陣列,也可以是物件()或物件陣列。
3、Bundle.putSerializable(Key,Object); //實現Serializable介面的物件
4、Bundle.putParcelable(Key, Object); //實現Parcelable介面的物件

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

intent可傳遞資料型別:

intent傳遞型別(abcd)
A、Serializable B、charsequence C、Parcelable D、Bundle

1、八種基本資料型別 及其對應陣列
2、String/Charsequence 及其對應陣列
3、Parcelable 及其對應陣列 /Serializable
4、bundle/intent

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述