1. 程式人生 > 其它 >安卓基礎學習 Day27 |資料儲存-SharedPreferences

安卓基礎學習 Day27 |資料儲存-SharedPreferences

技術標籤:學習日誌

目錄

寫在前面的話

1、主要參考自:https://b23.tv/Xqlo6e
2、內容如果有不對的,希望可以指出或補充。
3、新知識。

一、概述

SharedPreferences(共享引數):Android系統提供的一個輕量級的儲存類,適用於儲存數量較少的場合(如存取一些長期儲存到手機客戶端資訊,使用者個性化設定的字型等引數資訊)。以鍵值對(值只能是int、long、boolean、String和float基本的資料型別)的方式儲存在一個XML檔案中(檔案存放目錄:/data/data/應用程式包名/shared_prefs/*.xml),儲存在記憶體。

應用程式解除安裝後,檔案也會被刪除。

二、使用

檔名不存在就會建立一個,操作模式有兩種:

  • Context.MODE_PRIVATE(或0):【預設操作模式】,直接在把第二個引數寫0就是預設使用這種操作模式,代表該檔案是私有資料,只能被應用本身訪問,寫入的內容會覆蓋原檔案的內容
  • Context.MODE_MULTI_PRIVATE(或32768):用於多個程序共同操作一個SharedPreferences檔案,檢查該檔名對應的檔案存在就在其中追加內容,否則建立新檔案。

注:MODE_WORLD_READABLE(或1)[當前檔案可以被其他應用讀取]和MODE_WORLD_WRITEABLE(或2)[當前檔案可以被其他應用寫入] 這兩種模式已經在【Android4.2版本以後】廢棄了。

(一)儲存資料

// 1、通過呼叫內建函式(Context物件的)getSharedPreferences建立物件:可以被同一應用程式下的其他元件共享
//另:呼叫Activity物件的getPreferences()方法:獲得的SharedPreferences物件只能在該Activity中使用,會自動將當前類名作為檔名,只需要傳入操作模式即可
SharedPreferences sp = getSharedPreferences(檔名,操作模式);
//2、獲取SharedPreferences的編輯器,呼叫edit()方法
//使檔案處於可編輯狀態
SharedPreferences.Editor editor =
sp.edit(); //3、呼叫編輯器的putXXX(String key,xxx value)方法存入資料 //將資料放於編輯器中 editor.putString(String key, String value); //4、提交存入的值 //也可用editor.commit();方法 editor.apply(); //補充:editor.clear();-----》清除資料

【兩種提交方式區別】

  • apply (): 非同步處理。會先寫入記憶體,然後非同步寫入磁碟。推薦使用這個。
  • commit(): 有返回值。直接寫入磁碟。僅當需要立刻確定提交結果,並據此做相應的其他操作時,推薦用。

(二)讀取資料

// 1、通過呼叫內建函式(Context物件的)getSharedPreferences建立物件
SharedPreferences sp = getSharedPreferences(檔名,操作模式);
//2、呼叫編輯器的getXXX(String key,xxx default)方法讀取資料
sp.getString(String key, String default);

三、測試

在【安卓基礎練習 02 |登入註冊】的基礎上進行的。
功能:勾選記住使用者和密碼複選框後,再次進入app就會自動寫入使用者名稱和密碼。

佈局

實現程式碼

在LoginActivity.java檔案中:

package com.example.tasktwo;

import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

public class LoginActivity extends AppCompatActivity {
    //宣告控制元件變數
    private EditText edtName, edtPwd;
    private Button btnLogin, btnCancel;
    private CheckBox testSharedPreferences;

    /**
     * 新添部分-SharedPreferences
     */
    private SharedPreferences sp; // 宣告共享引數
    private SharedPreferences.Editor editor; // 宣告編輯器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //載入登入佈局頁面
        setContentView(R.layout.login_activity);
        //獲取相應控制元件
        edtName = findViewById(R.id.edt_username);
        edtPwd = findViewById(R.id.edt_password);
        btnLogin = findViewById(R.id.btn_login);
        btnCancel = findViewById(R.id.btn_cancel_login);
        testSharedPreferences = findViewById(R.id.test_sharedpreferences);//獲取控制元件

        /** 在onCreate()方法外宣告SharedPreferences、SharedPreferences.Editor的全域性變數
         * 新添部分-SharedPreferences
         * 公共部分
         */
        sp = getSharedPreferences("data",0);//1步
        /**
         * 讀取資料的實現
         */
        edtName.setText(sp.getString("name",""));//2步
        edtPwd.setText(sp.getString("pwd",""));
        /**
         *======================================
         */
         
        ///登入事件
        btnLogin.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                String name = edtName.getText().toString().trim();
                String pwd = edtPwd.getText().toString().trim();

                if(name.equals("admin") && pwd.equals("admin")){
                    // Toast.LENGTH_SHORT大概顯示時間為1秒,Toast.LENGTH_LONG大概顯示時間為3秒
                    Toast.makeText(LoginActivity.this,"恭喜,使用者名稱與密碼正確!",
                            Toast.LENGTH_SHORT).show();

                    /**
                     * 新添部分-SharedPreferences
                     * 判斷是否勾選了記住使用者名稱和密碼
                     * 儲存資料的實現
                     */
                    if(testSharedPreferences != null){
                        editor = sp.edit();//2步
                        editor.putString("name",name);//3步
                        editor.putString("pwd",pwd);
                        editor.apply();//4步
                    }
                    /**
                    *======================================
                    */

                    Intent intent_l = new Intent(LoginActivity.this,LoginMessage.class);
                    //封裝資料
                    Bundle usrData =new Bundle();
                    usrData.putString("l_name",name);
                    //攜帶資料包
                    intent_l.putExtras(usrData);
                    //啟動目標元件
                    startActivity(intent_l);

                }else{
                    Toast.makeText(LoginActivity.this,"遺憾,使用者名稱或密碼錯誤!請重新輸入",
                            Toast.LENGTH_SHORT).show();
                }
            }
        });
        //取消事件,也就是關閉當前介面
        btnCancel.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v) {
                finish();
            }
        });
    }
}

檢視檔案中儲存的資料

效果