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