iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0

在 Android 開發中,我們經常需要保存一些輕量級的資料,例如使用者的設定、登入狀態或是應用的偏好選項。這些資料通常不需要使用資料庫來保存,因為它們很小、也不需要複雜的數據結構來存取。在這樣的情境下,SharedPreferences 是一個非常適合的解決方案。

什麼是 SharedPreferences?

SharedPreferences 是 Android 提供的一種輕量級數據儲存方法,它可以讓我們以鍵值對的方式存取數據。我們可以用它來保存各種型態的數據,例如字串、整數、布林值等等。最常見的應用場景包括:

  • 保存使用者的偏好設定(例如夜間模式)
  • 保存簡單的狀態(例如登入狀態)
  • 保存臨時資料(例如應用的暫存資料)

SharedPreferences 的基本操作

在使用 SharedPreferences 時,主要分為三個步驟:

  1. 取得 SharedPreferences 實例
  2. 編輯數據
  3. 提交數據

1. 取得 SharedPreferences 實例

我們可以通過 getSharedPreferences() 取得 SharedPreferences 的實例。這個方法需要兩個參數:

  • 名稱:存取這組資料的名稱
  • 模式:通常使用 MODE_PRIVATE,表示只有這個應用程式可以存取這組資料。
    還有其他種模式像是 MODE_APPEND如果檔案已經存在,則在檔案後追加數據,否則會建立新檔案。這個模式通常與 FileOutputStream 結合使用,而不是 SharedPreferences。但在 SharedPreferences 中,它可以作為過去的兼容性選項,現在幾乎不再使用這個模式。
SharedPreferences sharedPreferences = getSharedPreferences("UserPrefs", MODE_PRIVATE);

2. 存取資料

接下來,我們需要透過 edit() 方法來編輯 SharedPreferences 的內容,然後使用 putString()putInt()putBoolean() 等方法來存入數據,最後使用 apply()commit() 來提交變更。

3. 讀取資料

讀取資料也非常簡單,直接使用 getString()getBoolean()getInt() 等方法來取得相應的數據。

String username = sharedPreferences.getString("username", "defaultUser");
boolean isLoggedIn = sharedPreferences.getBoolean("isLoggedIn", false);

實際應用範例:保存使用者設定

下面是一個實際應用 SharedPreferences 來保存和讀取使用者名稱以及登入狀態的範例。

MainActivity.java

package com.example.sharedpreferencesdemo;

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

import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private EditText usernameEditText;
    private Button saveButton, loadButton;

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

        // 初始化 UI 元件
        usernameEditText = findViewById(R.id.username_et);
        saveButton = findViewById(R.id.save_btn);
        loadButton = findViewById(R.id.load_btn);

        // 保存按鈕的點擊事件
        saveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                String username = usernameEditText.getText().toString();
                saveData(username);
            }
        });

        // 加載按鈕的點擊事件
        loadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                loadData();
            }
        });
    }

    // 保存資料到 SharedPreferences
    private void saveData(String username) {
        SharedPreferences sharedPreferences = getSharedPreferences("UserPrefs", MODE_PRIVATE);
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("username", username);
        editor.apply();
        Toast.makeText(this, "資料已保存", Toast.LENGTH_SHORT).show();
    }

    // 從 SharedPreferences 加載資料
    private void loadData() {
        SharedPreferences sharedPreferences = getSharedPreferences("UserPrefs", MODE_PRIVATE);
        String savedUsername = sharedPreferences.getString("username", "尚未保存使用者名稱");
        Toast.makeText(this, "保存的使用者名稱: " + savedUsername, Toast.LENGTH_SHORT).show();
    }
}

activity_main.xml

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

    <EditText
        android:id="@+id/username_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入使用者名稱" />

    <Button
        android:id="@+id/save_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="保存使用者名稱" />

    <Button
        android:id="@+id/load_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="加載使用者名稱" />
</LinearLayout>

成果圖如下

結論

透過這個範例,我們可以看到如何使用 SharedPreferences 來保存和讀取應用程式中的輕量級資料。它的使用方式非常簡單,不僅適合保存應用設置,也可以用來保存一些應用中的臨時狀態。SharedPreferences 的好處在於它無需複雜的設定,且在小型資料存取中非常高效。


上一篇
# DAY26 了解 MVP 架構在 Android 開發中的應用
下一篇
# DAY28 Android 開發之 MediaPlayer 的應用
系列文
「淺入 Android Studio 開發環境」—— 工具與插件的高效使用29
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言