SharedPreferences只能保存簡單類型的數據,只能儲存string,int,float,long和boolean資料類型。如果需要存取比較複雜的資料類型例如類別或影像,則需要對這些資料進行編碼。
本教學操作環境:windows7系統、java10版、Dell G3電腦。
日常開發中我們常常要用到保存數據,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; } }
使用SharedPreference保存list數據,其實可以保存Object物件
Android開發筆記-SharedPreferences 儲存實體類別以及任意型別
Android資料持久化之SharedPreference
所有基礎型別(byte/short/int/long/float/double/boolean/char 等)
String,List,Map,CharSequence等類別
#其他AIDL介面類型
所有Parcelable的類別
#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傳遞類型(abcd)
A、Serializable B、charsequence C、Parcelable D、Bundle
1、八種基本資料型別及其對應陣列
2、String/Charsequence 及其對應陣列
3、Parcelable 及其對應陣列/Serializable
4、bundle/intent
#相關免費學習推薦:java基礎教學
#以上是sharedpreferences可以儲存什麼資料類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!