iT邦幫忙

2024 iThome 鐵人賽

DAY 27
0

SharedPreferences是個適合儲存一些小型又簡單的數據的方式
它不適合儲存大量或複雜的資料,且即使是在程式重啟後資料仍然會存在
SharedPreferences有幾種模式

  • MODE_PRIVATE
    使用這個模式時只有這個app可以存取,也是目前最常使用的模式
  • MODE_MULTI_PROCESS
    這個模式會允許不同的process同時存取SharedPreferences

已廢棄的模式

  • MODE_WORLD_READABLE
    它可以允許其他app讀取此SharedPreferences
    但後來因為安全性的問題而被廢棄
  • MODE_WORLD_WRITEABLE
    它可以允許其他app讀取並寫入此SharedPreferences檔案
    但同上,因安全性問題而被廢棄

範例

接下來
我這邊用了一個可以存取姓名和email的程式

  • 開啟程式的樣子
    https://ithelp.ithome.com.tw/upload/images/20241005/20168456yGQWdfH0vk.png
  • 輸入姓名和email
    https://ithelp.ithome.com.tw/upload/images/20241005/20168456uTGX8ByCLO.png
  • 按下儲存
    清空兩個EditText並顯示Toast
    https://ithelp.ithome.com.tw/upload/images/20241005/20168456gbSyZDHAGr.png
  • 點擊拿取資料
    將資料從SharedPreferences中拿出顯示在下面的TextView
    接著顯示Toast
    https://ithelp.ithome.com.tw/upload/images/20241005/20168456TGYDng7PGC.png

進到程式碼

首先是MainActivity

private SharedPrefences Shpf;
Shpf = new SharedPrefences(this);

首先,先初始化SharedPrefences

saveBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Shpf.saveData(nameEt.getText().toString(), emailEt.getText().toString());
        Toast.makeText(MainActivity.this, "資料已儲存", Toast.LENGTH_SHORT).show();
        nameEt.setText("");
        emailEt.setText("");
    }
});

在點擊儲存按鈕後會把資料儲存起來、顯示Toast並清空兩個EditText

setBtn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showTv.setText("姓名: " + Shpf.getName() + "\n電子郵件: " + Shpf.getEmail());
        Toast.makeText(MainActivity.this, "資料已拿取", Toast.LENGTH_SHORT).show();
    }
});

在點擊拿取資料按鈕後會把資料拿出來顯示Toast並顯示在下方的TextView上

進到SharedPreferences的Activity

private static final String Name = "name";
private static final String Email = "email";

用來儲存電子郵件和姓名的key

private SharedPreferences shpf;
public SharedPrefences(Context context) {
    this.context = context;
    shpf = this.context.getSharedPreferences(context.getResources().getString(R.string.app_name), Context.MODE_PRIVATE);
}

初始化SharedPreferences並將模式設為只有這個APP可以存取
(getSharedPreferences這個方法可以指定或產生一個要用來存放的設定檔的xml)

public void saveData(String name, String email) {
    shpf.edit().putString(Name, name).apply();
    shpf.edit().putString(Email, email).apply();
}

儲存名稱和電子郵件

public String getName() {
    return shpf.getString(Name, "");
}

取得儲存的名稱

public String getEmail() {
    return shpf.getString(Email, "");
}

取得儲存的電子郵件
後面的兩個方法是在回傳回傳名稱和電子郵件的,他們在()中都有個"",這個""是當在SharedPreferences中找不到對應的Name或Email時所回傳的預設值,可自行設定
到這裡就可以正常執行程式了

下面附上完整的程式碼

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/main_name_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入姓名" />

    <EditText
        android:id="@+id/main_email_et"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="請輸入 Email" />

    <Button
        android:id="@+id/main_save_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="儲存" />

    <Button
        android:id="@+id/main_set_btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="拿取資料" />

    <TextView
        android:id="@+id/main_show_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingTop="16dp"
        android:textSize="16sp" />
</LinearLayout>

MainActivity

package com.example.test3;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
    private EditText nameEt;
    private EditText emailEt;
    private Button saveBtn;
    private Button setBtn;
    private TextView showTv;
    private SharedPrefences Shpf;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        nameEt = findViewById(R.id.main_name_et);
        emailEt = findViewById(R.id.main_email_et);
        saveBtn = findViewById(R.id.main_save_btn);
        setBtn = findViewById(R.id.main_set_btn);
        showTv = findViewById(R.id.main_show_tv);

        Shpf = new SharedPrefences(this);
        //初始化SharedPrefences

        saveBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Shpf.saveData(nameEt.getText().toString(), emailEt.getText().toString());
                Toast.makeText(MainActivity.this, "資料已儲存", Toast.LENGTH_SHORT).show();
                nameEt.setText("");
                emailEt.setText("");
            }
        });
        setBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showTv.setText("姓名: " + Shpf.getName() + "\n電子郵件: " + Shpf.getEmail());
                Toast.makeText(MainActivity.this, "資料已拿取", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

SharedPrefences

package com.example.test3;

import android.content.Context;
import android.content.SharedPreferences;

public class SharedPrefences {
    private Context context;
    private static final String Name = "name";
    private static final String Email = "email";
    private SharedPreferences shpf;
    public SharedPrefences(Context context) {
        this.context = context;
        shpf = this.context.getSharedPreferences(context.getResources().getString(R.string.app_name), Context.MODE_PRIVATE);
    }
    public void saveData(String name, String email) {
        shpf.edit().putString(Name,name).apply();
        shpf.edit().putString(Email, email).apply();
    }
    public String getName() {
        return shpf.getString(Name, "");

    }
    public String getEmail() {
        return shpf.getString(Email, "");
    }
}

下篇會開始介紹我們IT鐵人賽最後會完成的專案


上一篇
[Day 26] MVP架構介紹
下一篇
[Day 28] 完成一個記事本app(上) - 新增功能
系列文
深入Android Java程式語言 - 打造我的行動應用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言