數據存儲與訪問之——SharedPreferences

来源:https://www.cnblogs.com/Reverse-xiaoyu/archive/2019/08/28/11425441.html
-Advertisement-
Play Games

使用SharedPreferences(保存用戶偏好參數)保存數據, 當我們的應用想要保存用戶的一些偏好參數,比如是否自動登陸,是否記住賬號密碼,是否在Wifi下才能 聯網等相關信息,如果使用資料庫的話,顯得有點大材小用了!我們把上面這些配置信息稱為用戶的偏好 設置,就是用戶偏好的設置,而這些配置信 ...


  使用SharedPreferences(保存用戶偏好參數)保存數據, 當我們的應用想要保存用戶的一些偏好參數,比如是否自動登陸,是否記住賬號密碼,是否在Wifi下才能 聯網等相關信息,如果使用資料庫的話,顯得有點大材小用了!我們把上面這些配置信息稱為用戶的偏好 設置,就是用戶偏好的設置,而這些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而J2SE中使用properties屬性文件與xml文件來保存軟體的配置信息;而在Android中我們通常使用 一個輕量級的存儲類——SharedPreferences來保存用戶偏好的參數!SharedPreferences也是使用xml文件, 然後類似於Map集合,使用鍵-值的形式來存儲數據;我們只需要調用SharedPreferencesgetXxx(name), 就可以根據鍵獲得對應的值!使用起來很方便!

 

  SharedPreferences是一種輕型的Android數據存儲方式,它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。比較經典的使用方式例如用戶輸入框對過往登錄賬戶的存儲。實現SharedPreferences存儲的步驟如下:

 

1、根據Context獲取SharedPreferences對象
2、利用edit()方法獲取Editor對象。
3、通過Editor對象存儲key-value鍵值對數據。
4、通過apply()方法提交數據。

版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-28,17:41:40。
作者By-----溺心與沉浮----博客園

SharedPreferences的使用

  SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過SharedPreferences.edit()獲取的內部介面Editor對象實現。使用Preference來存取數據,用到了SharedPreferences介面和SharedPreferences的一個內部介面SharedPreferences.Editor,這兩個介面在android.content包中;
 1 1)寫入數據:
 2      //步驟1:創建一個SharedPreferences對象
 3      SharedPreferences sharedPreferences= getSharedPreferences("data",Context.MODE_PRIVATE);
 4      //步驟2: 實例化SharedPreferences.Editor對象
 5      SharedPreferences.Editor editor = sharedPreferences.edit();
 6      //步驟3:將獲取過來的值放入文件
 7      editor.putString("name", “Tom”);
 8      editor.putInt("age", 28);
 9      editor.putBoolean("marrid",false);
10      //步驟4:提交               
11      editor.commit();(apply())
12 
13  2)讀取數據:
14      SharedPreferences sharedPreferences= getSharedPreferences("data", Context .MODE_PRIVATE);
15      String userId=sharedPreferences.getString("name","");
16   
17 3)刪除指定數據
18      editor.remove("name");
19      editor.commit();
20 
21 4)清空數據
22      editor.clear();
23      editor.commit();(apply())

 

版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-28,17:41:40。
作者By-----溺心與沉浮----博客園 

 

註意:如果在 Fragment 中使用SharedPreferences 時,需要放在onAttach(Activity activity)裡面進行SharedPreferences的初始化,否則會報空指針 即 getActivity()會可能返回null

讀寫其他應用的SharedPreferences 步驟如下(未實踐):
 1. 在創建SharedPreferences時,指定MODE_WORLD_READABLE模式,表明該SharedPreferences數據可以被其他程式讀取;
 2. 創建其他應用程式對應的Context
 3. 使用其他程式的Context獲取對應的SharedPreferences
 4. 如果是寫入數據,使用Editor介面即可,所有其他操作均和前面一致;

 1 * SharedPreferences數據的四種操作模式:
 2      * 一、Context.MODE_PRIVATE
 3      * 二、Context.MODE_APPEND
 4      * 三、Context.MODE_WORLD_READABLE
 5      * 四、Context.MODE_WORLD_WRITEABLE
 6      *
 7      * Context.MODE_PRIVATE:為預設操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容
 8      * Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件.
 9      * Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該文件.
10      *
11      * MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取.
12      * MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入
13      *
14      * 特別註意:出於安全性的考慮,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已經被棄用

 

 1 try {
 2 //這裡的com.example.mpreferences 就是應用的包名
 3  Context mcontext = createPackageContext("com.example.mpreferences", CONTEXT_IGNORE_SECURITY);
 4 
 5  SharedPreferences msharedpreferences = mcontext.getSharedPreferences("name_preference", MODE_PRIVATE);
 6  int count = msharedpreferences.getInt("count", 0);
 7 
 8  } catch (PackageManager.NameNotFoundException e) {
 9        e.printStackTrace();
10  }

 

 

  新建一個安卓項目,在reslayoutactivity_main.xml添加代碼

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="用戶登錄"/>
    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="請輸入用戶名"/>
    <EditText
            android:id="@+id/editUserName"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="用戶名"/>
    <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="10dp"
            android:text="請輸入密碼"/>
    <EditText
            android:id="@+id/editUserPassword"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="密碼"/>
    <Button
            android:id="@+id/button_login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="登陸"/>
</LinearLayout>

效果如下:

 

 簡單的SharedPreferences工具類編寫SharedPreferences.java

 1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
 2 
 3 import android.content.Context;
 4 import android.content.SharedPreferences;
 5 import android.widget.Toast;
 6 
 7 import java.util.HashMap;
 8 import java.util.Map;
 9 
10 public class SharedHelp {
11     private Context context;
12 
13     public SharedHelp(){
14 
15     }
16 
17     public SharedHelp(Context context){
18         this.context = context;
19     }
20 
21     public void save(String userName, String passWord){
22         SharedPreferences sp = context.getSharedPreferences("MyMap", Context.MODE_PRIVATE);
23         SharedPreferences.Editor editor = sp.edit();
24         editor.putString("userName", userName);
25         editor.putString("passWord", passWord);
26         editor.apply();
27         Toast.makeText(context, "信息已寫入SharedPreferences中", Toast.LENGTH_SHORT).show();
28     }
29 
30     public Map<String, String> read(){
31         Map<String, String> data = new HashMap<String, String>();
32         SharedPreferences sp = context.getSharedPreferences("MyMap", Context.MODE_PRIVATE);
33         data.put("userName", sp.getString("userName", ""));
34         data.put("passWord", sp.getString("passWord", ""));
35         return data;
36     }
37 }

 

 在MainActivity中實現邏輯

 1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
 2 
 3 import androidx.appcompat.app.AppCompatActivity;
 4 
 5 import android.content.Context;
 6 import android.os.Bundle;
 7 import android.view.View;
 8 import android.widget.Button;
 9 import android.widget.EditText;
10 
11 import java.util.Map;
12 
13 public class MainActivity extends AppCompatActivity {
14     //實例化layout中EditText的editUserNmae
15     private EditText editUserName;
16     //實例化layout中EditText的editUserPassword
17     private EditText editUserPassword;
18     //實例化layout中Button的button_login
19     private Button button_login;
20     //定義上下文
21     private Context context;
22     //定義ShareHelp類的對象
23     private SharedHelp sharedHelp;
24     //定義兩個字元串名
25     private String strName;
26     private String strPassword;
27 
28     @Override
29     protected void onCreate(Bundle savedInstanceState) {
30         super.onCreate(savedInstanceState);
31         setContentView(R.layout.activity_main);
32         //獲取上下文
33         context = getApplicationContext();
34         sharedHelp = new SharedHelp();
35         bindViews();
36     }
37 
38     private void bindViews(){
39         //實例化的變數綁定相應的ID
40         editUserName = findViewById(R.id.editUserName);
41         editUserPassword = findViewById(R.id.editUserPassword);
42         button_login = findViewById(R.id.button_login);
43         //為按鈕設置監聽事件
44         button_login.setOnClickListener(new View.OnClickListener() {
45             @Override
46             public void onClick(View view) {
47                 //當按鈕被按下觸發時,從控制項中getText()並將其轉換成字元串
48                 strName = editUserName.getText().toString();
49                 strPassword = editUserPassword.getText().toString();
50                 //通過SharedHelp類中save方法,將其保存
51                 sharedHelp.save(strName, strPassword);
52             }
53         });
54     }
55 
56     @Override
57     protected void onStart() {
58         super.onStart();
59         //定義一個Map<String, String>類型的變數data用來接收shareHelp.read()方法的返回值
60         Map<String, String> data = sharedHelp.read();
61         //將獲取到的數據放置到兩個EditText中
62         editUserName.setText(data.get("userName"));
63         editUserPassword.setText(data.get("passWord"));
64     }
65 }

 

 本人十分不建議代碼在主程式入口處寫,建議另起文件寫,方便交流,就在MainActivity中寫了

 版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-28,17:41:40。
作者By-----溺心與沉浮----博客園

 

 最後再寫一個SharedPreferences的工具集類

 SharedPreferencesUtillty.java

  1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
  2 
  3 import android.content.Context;
  4 import android.content.SharedPreferences;
  5 
  6 import java.util.Map;
  7 
  8 public class SharedPreferenceUtillty {
  9     //保存的SP文件名
 10     public static final String FILE_NAME = "MyMap";
 11 
 12     /**
 13      * SharedPreferences數據的四種操作模式:
 14      * 一、Context.MODE_PRIVATE
 15      * 二、Context.MODE_APPEND
 16      * 三、Context.MODE_WORLD_READABLE
 17      * 四、Context.MODE_WORLD_WRITEABLE
 18      *
 19      * Context.MODE_PRIVATE:為預設操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容
 20      * Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件.
 21      * Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該文件.
 22      *
 23      * MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取.
 24      * MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入
 25      *
 26      * 特別註意:出於安全性的考慮,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已經被棄用
 27      */
 28 
 29     /**
 30      * 保存數據
 31      */
 32     public static void putData(Context context, String key, Object object){
 33         //實例化SharedPreferences對象(第一步)
 34         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
 35         //實例化SharedPreferences.Editor對象(第二步)
 36         SharedPreferences.Editor editor = sp.edit();
 37         //用putObject的方法保存數據,取決於第三個參數你使用的什麼類型的變數
 38         if (object instanceof Boolean){
 39             editor.putBoolean(key, (Boolean) object);
 40         }else if (object instanceof Float){
 41             editor.putFloat(key, (Float) object);
 42         }else if (object instanceof Integer){
 43             editor.putInt(key, (Integer) object);
 44         }else if (object instanceof Long){
 45             editor.putLong(key, (Long) object);
 46         }else if (object instanceof String){
 47             editor.putString(key, (String) object);
 48         }
 49         editor.apply();
 50     }
 51 
 52     /**
 53      * 獲取指定數據
 54      */
 55     public static Object getData(Context context, String key, Object object){
 56         //實例化SharedPreferences對象(第一步)
 57         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
 58         //用getObject的方法保存數據,取決於第三個參數你使用的什麼類型的變數(第二步)
 59         if (object instanceof Boolean){
 60             return sp.getBoolean(key, (Boolean) object);
 61         }else if (object instanceof Float){
 62             return sp.getFloat(key, (Float) object);
 63         }else if (object instanceof Integer){
 64             return sp.getInt(key, (Integer) object);
 65         }else if (object instanceof Long){
 66             return sp.getLong(key, (Long) object);
 67         }else if (object instanceof String){
 68             return sp.getString(key, (String) object);
 69         }
 70         return null;
 71     }
 72 
 73     /**
 74      * 返回所有的鍵值對
 75      */
 76     public static Map<String, ?> getAll(Context context){
 77         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
 78         Map<String, ?> map = sp.getAll();
 79         return map;
 80     }
 81 
 82     /**
 83      * 檢查對應的數據是否存在
 84      */
 85     public static boolean contains(Context context, String key){
 86         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
 87         return sp.contains(key);
 88     }
 89 
 90     /**
 91      * 刪除指定key值的數據
 92      */
 93     public static void remove(Context context, String key){
 94         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
 95         SharedPreferences.Editor editor = sp.edit();
 96         editor.remove(key);
 97         editor.apply();
 98     }
 99 
100     /**
101      * 刪除所有的數據
102      */
103     public static void clear(Context context, String key){
104         SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
105         SharedPreferences.Editor editor = sp.edit();
106         editor.clear();
107         editor.apply();
108     }
109 
110 }

 

版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-28,17:41:40。
作者By-----溺心與沉浮----博客園

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 四、簡單查詢 ​ 簡單查詢的主要特征就是將一張數據表之中的全部數據行進行顯示,而後可以利用 SELECT 子句來控制所需要的輸出列。 4.1、基礎語法 範例 :查詢 emp 表中的數據(全部數據查詢) ​ 在取得全部數據後,可以發現某些列上會顯示 null 的信息,null 表示的是沒有內容,但 n ...
  • 在資料庫view的創建中,會遇到一些跨資料庫的view腳本,但是在將view更新到production的時候可能忘記更改database name,導致出現一些問題。 以下腳本可以檢查出包含某個關鍵字的view name,只需要修改 條件即可 TSql type(v,fn,p) select nam ...
  • [學習筆記] 3)配置環境變數:(環境變數中的~1,~2,~3的用法)i)JAVA_HOME:註意C:\Program Files目錄存在空格,變成C:\Progra~1\Java\jdk1.8.0_144。(註意:長於8個字元的文件名和文件夾名,都被簡化成前面6個有效字元,後面~1,有重名的就 ~ ...
  • 1. 簡介 資料庫,現代化的數據存儲存儲手段,是一種特殊的文件,其中存儲著需要的數據。 特點: 持久化存儲 讀寫速度極高 保證數據的有效性 對程式支持性非常好,容易擴展 2. Mysql (1)具有數據完整性: 一個資料庫就是一個完整的業務單元,可以包含多張表,數據被存儲在表中。在表中為了更加準確的 ...
  • 設置主機名 [root@localhost ~]# cat /etc/hosts127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4::1 localhost localhost.localdomai... ...
  • 前言 最近在處理一個歷史遺留項目的時候飽受其害,主要表現為偶發性的 SharedPreferences 配置文件數據錯亂,甚至丟失。經過排查發現是多進程的問題。項目中有兩個不同進程,且會頻繁的讀寫 SharedPreferences 文件,所以導致了數據錯亂和丟失。趁此機會,精讀了一遍 Shared ...
  • 本篇概要 小程式開發前的準備 小程式視圖與渲染 小程式事件 註:總的來說,微信小程式的開發代碼寫法,和 HTML、CSS、JavaScript類似很像.jpg 一,微信小程式開發前的準備 於微信小程式官網進行註冊 ==> https://mp.weixin.qq.com/cgi-bin/wx 註冊完 ...
  • void *pxdata = CVPixelBufferGetBaseAddress(pxbuffer);然後在創建上下文以pxdata 所指向的記憶體作為上下文數據存貯的容器, 最後 渲染 上下文[self.webView.layer renderInContext:context];這樣就將 we ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...