昨天做的 Todolist,輸入完待辦事項後想說來玩個遊戲,結果跳出去再回來就發現 Todolist 所有紀錄都消失了,這......該怎麼辦呢?!
發生這種情況,是因為東西並沒有被保存下來,一旦離開 APP 就會清空,再進來其實是重新跑一次程式,如果想要讓重要的資料被保留(例如:使用者帳號/密碼),就要讓它被存取在一個地方,類似保險櫃、寄放處之類的地方,下次才能從中取回使用者需要的資料。
使用:SharedPreferences
如果想要儲存資料,可以使用 SharedPreferences 這個類別,它是用來存放一些基本型態的資料,像是 String、Int等等,使用方式就是在儲存時設定一個 key 值和它對應的 value 值,當我們要讀取資料時就是拿這個 key 值來找需要的東西。
取得方式
getSharedPreferences
取得或建立一個 SharedPreferences,可以對該 SharedPreferences 進行檢視或進一步修改,兩個參數:
getSharedPreferences(name: String!, mode: Int): SharedPreferences!
name:SharedPreferences 文件名稱
搜尋對應此名稱的 SharedPreferences 文件,就像是銀行戶名一樣找到戶頭資料,如果沒有找到那就會在 editor.commit() 之後創建該一個新的 sharepreference
mode:SharedPreferences 操作模式
讀取權限,代表該 SharedPreferences 使用範圍,決定了誰可以對它做讀取或寫入動作,就像電影裡特勤機構的資料加密等級一樣,誰有權限、誰才可以查看修改資料,常用的是 MODE_PRIVATE
(只允許該 APP 存取)
寫入資料
SharedPreferences.Editor --- interface
用來修改 SharedPreferences 裡面的資料,常用的方法有 put(key,value)、commit()、apply() 或 remove() 等等,使用範例如下:
//找到或建立一個名為 name 的 sharedPreferences文件
val sharedPreferences = getSharedPreferences("name", Activity.MODE_PRIVATE)
val editor = sharedPreferences.edit() //取得 Editor 物件
editor.putString("key", "value") //寫入資料的key-value
editor.apply() //執行寫入動作
A = 基本資料型態,可為boolean, float, int, long, String等類型。
和寫入資料的架構相似,一個是 put 東西、一個是 get 東西,差異在於後者是檢視資料,不需要做內容更動,所以它省略 .edit() 這一步,可以直接開啟 SharedPreferences 後讀取內容,讀的方式就是取儲存時的 key 值,範例如下:
val sharedPreferences = getSharedPreferences("name", Activity.MODE_PRIVATE)
val value = sharedPreferences.getString("key", "") //讀資料的 key,取得對應的 value字串
TextView.setText(value)
介紹完 SharedPreferences 基本使用方式後,可以來更動原本的程式碼
1. 存取資料(Main2Activity.kt)
之前我們是放入 Bundle 用 Intent 傳送+返回,不過現在不需要傳東西了,只需要做返回動作(finished),另設一個存資料的動作:
todo
、value 值為 ${editText2.text}
」資料,存完之後會有 Toast 提示使用者輸入什麼文字fun save(){
val sharedPreferences = getSharedPreferences("save", Activity.MODE_PRIVATE)
val editor = sharedPreferences.edit()
editor.putString("todo", "${editText2.text}")
editor.apply()
Toast.makeText(this, "「${editText2.text}」儲存成功", Toast.LENGTH_SHORT).show()
}
2. 實作存取與返回動作(Main2Activity.kt)
寫好 function 之後就是實作出來,把 Bundle和 Intent 註解掉,放入剛剛寫好的函式,把 setResult 第二個參數移掉(沒有 Intent 要傳),當點擊事件發生,會分別做兩個動作:
else {
// val b = Bundle()
// b.putString("todo", "${editText2.text}")
// val intent1 = Intent()
// intent1.putExtras(b)
save() //剛剛寫的儲存動作的函式
setResult(Activity.RESULT_OK)
finish()
}
寫入動作大概是這樣操作,明天繼續來講解怎麼讀取資料、怎麼把資料放進 RecycleView 裡面~敬請期待