Android Kotlin 使用 Preferences DataStore 儲存資料 示範

DataStore 是被設計用來取代 SharedPreferences 的,因為 SharedPreferences 是設計在單線程上使用的,在多線程上很容易造成鎖定,且內容較大時會讓介面卡住。

DataStore 有以下兩種:
  • Preferences DataStore: 不需要定義結構,使用鍵值對,不提供類型安全性
  • Proto DataStore: 需要使用「通訊協定緩衝區(Protocol Buffers)」定義結構,提供類型安全
兩種都只能用來儲存簡單資料, 本篇先示範最快速上手的 Preferences DataStore。

安裝

在 build.gradle.kts (Module :app) 中加入下面這行來加入套件:
    
dependencies {
    implementation("androidx.datastore:datastore-preferences:1.0.0")
}
    

使用示範

這裡建立一個 class ,用來負責儲存設定相關的資料。目前只有儲存 user_name 這一個設定值。並且建立 getUserName 和 setUserName 兩個方法,將 user_name 資料的讀寫包裝起來方便使用。
    
import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.first

class SettingsDataStore(private val context: Context) {
    companion object {
        private val Context.dataStore: DataStore<Preferences> by preferencesDataStore("settings")

        private val USER_NAME_KEY = stringPreferencesKey("user_name")
    }

    suspend fun getUserName(): String? {
        return context.dataStore.data.first()[USER_NAME_KEY]
    }

    suspend fun setUserName(token: String) {
        context.dataStore.edit { preferences ->
            preferences[USER_NAME_KEY] = token
        }
    }
}
    

實例化
    
    val context = LocalContext.current
    val settingsDataStore = SettingsDataStore(context)
    

使用:
    
// 從 DataStore 中讀取使用者名稱
val userName = settingsDataStore.getUserName()

// 將使用者名稱寫入到 DataStore 中
settingsDataStore.setUserName("Ruyut")
    

非常簡單!就算關閉 App 再重新開啟資料還是存在!不過要注意的是 Preferences DataStore 不具有類型安全,都是以字串的方式儲存。

註:在同一個處理程序中只能建立一個 DataStore 實例

參考資料:
Android Developers - DataStore

留言