安卓基礎學習 Day27 |資料儲存-SharedPreferences
阿新 • • 發佈:2021-02-14
技術標籤:學習日誌
目錄
寫在前面的話
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();
}
});
}
}
檢視檔案中儲存的資料
效果