iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 17
0
自我挑戰組

Kotlin Everyday:新手寫程式踩的坑系列 第 17

Day 17 ─用 Kotlin 做待辦清單 Todolist(2) SharedPreferences 上篇

  • 分享至 

  • xImage
  •  

昨天做的 Todolist,輸入完待辦事項後想說來玩個遊戲,結果跳出去再回來就發現 Todolist 所有紀錄都消失了,這......該怎麼辦呢?!
發生這種情況,是因為東西並沒有被保存下來,一旦離開 APP 就會清空,再進來其實是重新跑一次程式,如果想要讓重要的資料被保留(例如:使用者帳號/密碼),就要讓它被存取在一個地方,類似保險櫃、寄放處之類的地方,下次才能從中取回使用者需要的資料。

使用:SharedPreferences

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() 等等,使用範例如下:

  1. 取得或建立一個 SharedPreferences
  2. .edit() 取得 Editor 物件
  3. 寫入資料方法 put(key,value)
  4. 不要忘記 commit() 或 apply() 執行
                           //找到或建立一個名為 name 的 sharedPreferences文件
val sharedPreferences = getSharedPreferences("name", Activity.MODE_PRIVATE)
val editor = sharedPreferences.edit()  //取得 Editor 物件
editor.putString("key", "value")       //寫入資料的key-value
editor.apply()                         //執行寫入動作

讀取資料
getA(key, defValue)

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),另設一個存資料的動作:

  • 先寫一個儲存的 function
    建立名為 save 的 SharedPreferences 文件,進行寫入修改,存入「key 值為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 要傳),當點擊事件發生,會分別做兩個動作:

  • 把資料存入 SharedPreferences 文件
  • 返回主頁(不夾帶資料)
else {
//    val b = Bundle()
//    b.putString("todo", "${editText2.text}")
//    val intent1 = Intent()
//    intent1.putExtras(b)

    save()  //剛剛寫的儲存動作的函式
    
    setResult(Activity.RESULT_OK)
    finish()
}

寫入動作大概是這樣操作,明天繼續來講解怎麼讀取資料、怎麼把資料放進 RecycleView 裡面~敬請期待


上一篇
Day 16 ─用 Kotlin 做待辦清單 Todolist(1) 使用Menu+RecycleView
下一篇
Day 18 ─用 Kotlin 做待辦清單 Todolist(2) SharedPreferences 中篇
系列文
Kotlin Everyday:新手寫程式踩的坑30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言