1. 程式人生 > >SharedPreferences的用法及指南

SharedPreferences的用法及指南

一句話概括

SharedPreferences在android中主要以xml檔案的方式儲存較小的鍵值對。

1.SharedPreferences介紹

在android中,儲存較小的android鍵值對,主要可以儲存的資料型別有:

 - String
 - Float
 - Boolean
 - Int
 - Long
 - StringSet  Set集合,泛型為String

2.儲存形式

SharedPreferences以xml的形式儲存在 data/data/包名/shared_prefs 這個目錄下,
具體情況大概是以下情況:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map> <string name="name">nick</string> <int name="age" value="18" /> <float name="high" value="1.8" /> <boolean name="isBoy" value="true" /> <long name="ID" value="123456789999999" /> <set name="setString"> <string>1</string
>
<string>2</string> <string>3</string> <string>4</string> </set> </map>

3.儲存方式

一個超級簡單的例子:

    SharedPreferences sp = getPreferences(MODE_PRIVATE);
    SharedPreferences.Editor edit = sp.edit();
    edit.putString("key"
, "value"); edit.apply();

解釋:
getPreferences(int mode)這個方法是Context的方法,所以可以在activity中使用,
可以理解為打算要建立一個名字為:當前Activity名字.xml 的檔案,
sp.edit();這是向當前的sp要一個編輯器,以便給它加入鍵值對。
Editor的用法類似map,以put的形式賦值。
edit.apply(),表示提交。完成這一步,xml才會真正的建立。

關於獲取SharedPreferences其實有2種方式:

getPreferences(int mode)
getSharedPreferences(String name, int mode)

mode這個引數我們待會講,我們先看有name這個引數和沒有name這個引數有什麼區別
name這個引數其實就是給xml檔案取名字,例如以下程式碼:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getPreferences(MODE_PRIVATE).edit().apply();
        getSharedPreferences("haha", MODE_PRIVATE).edit().apply();

    }

那麼在資料夾下面就會建立這2個xml檔案
這裡寫圖片描述

mode這個引數,也就是使用模式,有4種使用模式

  • MODE_PRIVATE
  • MODE_APPEND
  • MODE_WORLD_READABLE
  • MODE_WORLD_WRITEABLE

但是下面兩種已經過時了,Google官方不推薦使用,因為不安全,別人就可以讀寫這個檔案了。
我們來看看前面兩種。官方解釋:
MODE_PRIVATE:該模式下,建立的檔案只能被本應用訪問
MODE_APPEND:該模式下,如果檔案已經存在,則將資料寫入現有檔案的結尾,而不是擦除它.。
其實我感覺這兩個模式沒啥區別。

接下來我們看看提交的方式,其實也有兩種:

  • edit.apply();
  • edit.commit();

這兩種提交方式是有區別的
apply()這種的效率要高些,而且沒有返回值。提交了後不需要關心是否提交成功,反正老子提交了。
commit()這種的效率就要低一些的,有一個boolean返回值,true就提交成功了,false就提交失敗了,如果有多個edit同時提交,系統只認最後一個。

4.獲取方式

SharedPreferences的獲取方式更加簡單,上程式碼:

    SharedPreferences sp = getPreferences(MODE_PRIVATE);
    String string = sp.getString("key", "default");

你沒看錯,就只有兩行程式碼,getString(“key”,”default”),第一次引數為儲存時候的key值,第二個引數為預設值,當沒有獲取到資料的時候,會啟動預設值。這是防止自己傻逼忘了儲存值就開始取值了。

5.方式技巧

以上我已經把基本的使用當時都說了,現在該說說,平時我怎麼用他了。

首先寫一個工具類,程式碼有點多,我就直接拷了:

package com.qxf.archer.sharedpreferencesdemo;

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

/**
 * 類描述:
 * <p>
 * 作者:Administrator on 2017/1/12 0012 01:25
 * 郵箱:[email protected]
 */

public class SharedPreferencesUtils {

    /**
     * 上下文
     */
    private static Context mContext;

    /**
     * 初始化SharedPreferences,必須使用該方法
     */
    public static void init(Context context) {
        mContext = context;
    }

    /**
     * 丟擲異常
     */
    private static void throwInit(){
        if (mContext == null) {
            throw new NullPointerException("在使用該方法前,需要使用init()方法,推薦將init()放入Application中");
        }
    }

    /**
     * 插入字串
     * @param name 檔名
     * @param key key
     * @param value 值
     */
    public static void putString(String name, String key, String value) {
        throwInit();
        SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sp.edit();
        edit.putString(key, value);
        edit.apply();
    }

    /**
     * 獲取字串
     * @param name 檔名
     * @param key key
     * @param defaultValue 沒獲取到時的預設值
     * @return 字串
     */
    public static String getString(String name, String key, String defaultValue) {
        throwInit();
        SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
        return sp.getString(key, defaultValue);
    }

    /**
     * 插入整型
     * @param name 檔名
     * @param key key
     * @param value 值
     */
    public static void putInt(String name, String key, int value) {
        throwInit();
        SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sp.edit();
        edit.putInt(key, value);
        edit.apply();
    }

    /**
     * 獲取整型
     * @param name 檔名
     * @param key key
     * @param defaultValue 沒獲取到時的預設值
     * @return 整型
     */
    public static int getInt(String name, String key, int defaultValue) {
        throwInit();
        SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
        return sp.getInt(key, defaultValue);
    }

    /**
     * 插入浮點型
     * @param name 檔名
     * @param key key
     * @param value 值
     */
    public static void putFloat(String name, String key, float value) {
        throwInit();
        SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sp.edit();
        edit.putFloat(key, value);
        edit.apply();
    }

    /**
     * 獲取浮點型
     * @param name 檔名
     * @param key key
     * @param defaultValue 沒獲取到時的預設值
     * @return 浮點型
     */
    public static float getFloat(String name, String key, float defaultValue) {
        throwInit();
        SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
        return sp.getFloat(key, defaultValue);
    }

    /**
     * 插入Long型
     * @param name 檔名
     * @param key key
     * @param value 值
     */
    public static void putLong(String name, String key, long value) {
        throwInit();
        SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sp.edit();
        edit.putLong(key, value);
        edit.apply();
    }

    /**
     * 獲取長整型
     * @param name 檔名
     * @param key key
     * @param defaultValue 沒獲取到時的預設值
     * @return 長整型
     */
    public static float getLong(String name, String key, long defaultValue) {
        throwInit();
        SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
        return sp.getLong(key, defaultValue);
    }

    /**
     * 插入boolean型
     * @param name 檔名
     * @param key key
     * @param value 值
     */
    public static void putBoolean(String name, String key, boolean value) {
        throwInit();
        SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
        SharedPreferences.Editor edit = sp.edit();
        edit.putBoolean(key, value);
        edit.apply();
    }

    /**
     * 獲取布林型
     * @param name 檔名
     * @param key key
     * @param defaultValue 沒獲取到時的預設值
     * @return 布林型
     */
    public static boolean getBoolean(String name, String key, boolean defaultValue) {
        throwInit();
        SharedPreferences sp = mContext.getSharedPreferences(name, Context.MODE_PRIVATE);
        return sp.getBoolean(key, defaultValue);
    }

}

使用方式:
1.首先建立一個MyApplication,繼承自Application,並且在清單檔案裡面宣告好,如下:

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:name=".MyApplication"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

2.在自己建立的application中的oncreate方法中寫如下:

    @Override
    public void onCreate() {
        super.onCreate();
        SharedPreferencesUtils.init(this);
    }

3.建立一個Constants類,主要記錄常量,可以在裡面規定檔名字,key什麼的,為的是保證自己不把key寫錯,例如:

public class Constants {

    /**
     * xml檔名
     */
    public static final String SHARD_NAME = "a1";

    public static final String SHARD_NAME_STRING = "string";
    public static final String SHARD_NAME_INT = "int";
    public static final String SHARD_NAME_FLOAT = "float";
    public static final String SHARD_NAME_LONG = "long";
    public static final String SHARD_NAME_BOOLEAN = "boolean";


}

接下來就可以開始使用了:
佈局,今天他長這樣:
這裡寫圖片描述
然後,MainActivity.java

package com.qxf.archer.sharedpreferencesdemo;

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

public class MainActivity extends AppCompatActivity implements View.OnClickListener {

    private Button jump;
    private Button addString;
    private Button addInt;
    private Button addLong;
    private Button addFloat;
    private Button addBoolean;
    private Button checkAll;
    private TextView show;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();

        SharedPreferencesUtils.getBoolean("asdas", "as", true);

    }

    private void initView() {
        addString = (Button) findViewById(R.id.addString);
        addInt = (Button) findViewById(R.id.addInt);
        addLong = (Button) findViewById(R.id.addLong);
        addFloat = (Button) findViewById(R.id.addFloat);
        addBoolean = (Button) findViewById(R.id.addBoolean);
        checkAll = (Button) findViewById(R.id.checkAll);
        show = (TextView) findViewById(R.id.show);

        addString.setOnClickListener(this);
        addInt.setOnClickListener(this);
        addLong.setOnClickListener(this);
        addFloat.setOnClickListener(this);
        addBoolean.setOnClickListener(this);
        checkAll.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.addString:
                SharedPreferencesUtils.putString(Constants.SHARD_NAME, 
                    Constants.SHARD_NAME_STRING, "字串");
                break;
            case R.id.addInt:
                SharedPreferencesUtils.putInt(Constants.SHARD_NAME, 
                    Constants.SHARD_NAME_INT, 10);
                break;
            case R.id.addLong:
                SharedPreferencesUtils.putLong(Constants.SHARD_NAME, 
                    Constants.SHARD_NAME_LONG, 12345678999999L);

                break;
            case R.id.addFloat:
                SharedPreferencesUtils.putFloat(Constants.SHARD_NAME, 
                    Constants.SHARD_NAME_FLOAT, 3.14f);

                break;
            case R.id.addBoolean:
                SharedPreferencesUtils.putBoolean(Constants.SHARD_NAME, 
                    Constants.SHARD_NAME_BOOLEAN, true);

                break;
            case R.id.checkAll:

                String aString = SharedPreferencesUtils
                    .getString(Constants.SHARD_NAME, Constants.SHARD_NAME_STRING, "預設值");
                int anInt = SharedPreferencesUtils
                    .getInt(Constants.SHARD_NAME, Constants.SHARD_NAME_INT, -1);
                float aLong = SharedPreferencesUtils
                    .getLong(Constants.SHARD_NAME, Constants.SHARD_NAME_LONG, -1L);
                float aFloat = SharedPreferencesUtils
                    .getFloat(Constants.SHARD_NAME, Constants.SHARD_NAME_FLOAT, -1.0f);
                boolean aBoolean = SharedPreferencesUtils.getBoolean(Constants
                    .SHARD_NAME, Constants.SHARD_NAME_BOOLEAN, false);

                String result = aString + "\n" + anInt 
                    + "\n" + aLong + "\n" + aFloat + "\n" + aBoolean;

                show.setText(result);

                break;
        }
    }
}

如果要新增key就直接在constants這個類裡面新增就行了,是不是很簡單,雖然工具類很長,但是以後使用起來就特別簡單了,特別是要經常使用sharedpreferences的時候。

相關推薦

SharedPreferences用法指南

一句話概括 SharedPreferences在android中主要以xml檔案的方式儲存較小的鍵值對。 1.SharedPreferences介紹 在android中,儲存較小的android鍵值對,主要可以儲存的資料型別有: - String

Linux中yum和apt-get用法區別

記錄 auto yum安裝軟件 mirror 內核 epo 綁定 提示 們的 Linux中yum和apt-get用法及區別 一般來說著名的linux系統基本上分兩大類: 1.RedHat系列:Redhat、Centos、Fedora等 2.Debian系列:De

iptables 用法常用模塊總結

iptables 範圍 著圖 針對 規則 用法 是否 傳輸數據 net iptables傳輸數據包的過程:   1. 當一個數據包進入網卡時,它首先進入PREROUTING鏈,內核根據數據包目的IP判斷是否需

【轉】event.keyCode用法列表

strong page ets cells 不支持 和數 jump fire 靜音 event.keyCode用法及列表 HTML 用戶名:<input type="text" id="UserAccount" onKeyPress="JumpByEnter(

SharedPreferences用法

編輯 sof soft 技術 雜類 文件中 mic ren base64 SharedPreferences是Android四種數據存儲技術中的一種,它是一種輕型的數據存儲方式,它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信 息,其對

【Java學習筆記之二十二】解析接口在Java繼承中的用法實例分析

ani 復制代碼 ads compute 現在 target body 常量 實現接口 一、定義 Java接口(Interface),是一系列方法的聲明,是一些方法特征的集合,一個接口只有方法的特征沒有方法的實現,因此這些方法可以在不同的地方被不同的類實現,而這些實現可以具

hash在URL上的用法作用

指導 使用方法 發生 show event 字符串 重載 完全 整理 閱讀目錄 1. # 2. ? 3. & 回到頂部 1. # 10年9月,twitter改版。一個顯著變化,就是URL加入了"#!"符號。比如,改版前的用戶主頁網

安裝軟件包的三種方法、rpm包介紹工具用法、yum用法搭建本地倉庫

安裝軟件包的三種方法、rpm包介紹及工具用法、yum用法及搭建本地倉庫一、安裝軟件包的三種方法rpm工具rpm(Redhat Package Manager)RPM軟件包管理器,是以一種數據庫記錄的方式來將我們所需要的套件安裝到Linux主機的一套管理程序。rpm包是預先在Linux機器上編譯好並打包好的文件

(轉)輕松掌握shell編程中數組的常見用法示例

分享 shell編程 內容 就是 linu 迷糊 常見 /etc/ med 緣起:在老男孩進行linux培訓shell編程教學中,發現不少水平不錯的網友及同學對數組仍然很迷糊,下面就給大家分享下數組的用法小例子,希望能給大家一點幫助。其實SHELL的數組很簡單,好用。我們學

WordPress分類列表函數:wp_list_categories用法參數詳解舉例

array play ide rgs arc err 無序 null 列表函數 http://www.511yj.com/wordpress-wp-categories.html 註意: 1、 wp_list_categories() 和 list_cats() 以及

Python中,While循環語句的用法註意事項

pen bubuko 縮進 .com 對比 出錯 lag spl 處的 今天跟著老師學習了While語句的用法,聽老師講的時候是聽明白了,感覺好簡單,但是自己做一遍的時候出了好多處的錯誤。我犯的錯誤都是新手常犯的,因此我覺得有必要把這次記錄下來,提醒自己也提醒跟我一樣的小白

DOM用法應用

html html中 文本節點 樣式 before get nod node 沒有 DOM介紹:文檔對象模型 為了方便javascript語言通過dom操作html比較方便; HTML中節點分類: 1.文檔節點(document) 2.元素節點 3.文本節點 4.屬性節點

grep和egrep的用法解釋說明

init 新建 -i 網卡 前三 打印 內容 alt 一道 grep是一種強大的搜索工具,它能夠用正則表達式搜索文本,並把匹配的行打印出來。-a 表示不要忽視二進制數據。-A顯示列數,出了顯示符合樣本的那一行之外,並顯示該行之後的內容。-b 在顯示符合樣本的那一行之外,並顯

Union用法說明:

clas target tex www pst 說明 href union all 默認 Union是用戶合並多個select結果集的操作符,需要註意的是:select語句需要有相同的列數,類似的數據類型,且列的順序相同,另外,UNION 結果集中的列名總是等於 UNION

sed詳解---用法解釋

nts parameter 同一行 開頭 types consul win 命令 one 1.sed -n ‘2‘p filename 打印文件的第二行。 2.sed -n ‘1,3‘p filename 打印文件的1到3行 3. sed -n ‘/Neave/‘p fil

Linux學習閑談(三) ——SVN用法切版本與合版本

服務 accept 上線 全局 顯示 cnblogs class 文件合並 刪除一個文件 Linux學習閑談(三) ——SVN用法及切版本與合版本 (轉載請附上本文鏈接——linhxx) SVN(Subversion)在工程中運用廣泛,多人合作項目

list,map,set集合的基本用法差異

nbsp htable body 根據 pos null clas 速度 就是 List:1.可以允許重復的對象。    2.可以插入多個null元素。 3.是一個有序容器,保持了每個元素的插入順序,輸出的順序就是插入的順序。 4.常用的實

python基礎 列表 的用法介紹

用法 class 反轉 下標 索引 min() print 追加 位置 列表 首先定義一個列表 聲明列表 列表名字=[值1,值2] list=[1,2,3,4,5] 這是一個列表,列表中有五個元素(1,2,3,4,5) 顯示list列表 print list 輸出 —

c#中this的用法作用

sys 靜態成員 mes 成員 成員方法 read 訪問 write stat 在C#中, 1. this關鍵字代表當前實例,我們可以用this.來調用當前實例的成員方法,變量,屬性,字段等; 2. 也可以用this來做為參數狀當前實例做為參

Nginx的alias的用法與root的區別

nginx root alias 先看官方文檔http://nginx.org/en/docs/http/ngx_http_core_module.html#alias http://nginx.org/en/docs/http/ngx_http_core_module.html#root先看root