DataStore 是被設計用來取代 SharedPreferences 的,因為 SharedPreferences 是設計在單線程上使用的,在多線程上很容易造成鎖定,且內容較大時會讓介面卡住。
DataStore 有以下兩種:
實例化
使用:
非常簡單!就算關閉 App 再重新開啟資料還是存在!不過要注意的是 Preferences DataStore 不具有類型安全,都是以字串的方式儲存。
註:在同一個處理程序中只能建立一個 DataStore 實例
參考資料:
Android Developers - DataStore
DataStore 有以下兩種:
- Preferences DataStore: 不需要定義結構,使用鍵值對,不提供類型安全性
- Proto DataStore: 需要使用「通訊協定緩衝區(Protocol Buffers)」定義結構,提供類型安全
安裝
在 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
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com