Jetpack DataStore的初使用

5,553 阅读1分钟

在今天凌晨的1:14分,谷歌的安卓开发者官推发布了Jetpack DataStore的alpha版。Jetpack DataStore是一个新的数据存储解决方案,其目的是为了取代SharedPreferences。

a new and improved data storage solution aimed at replacing SharedPreferences.

Jetpack DataStore是基于Kotlin协程和Flow的,并提供两种形式实现。一种是Proto DataStore,另一种是Preferences DataStore。前者可存储类对象(typed objects),后者是存储键值对(和SharedPreferences相似)

由于我还没接触过Protocol Buffers,所以下面的初使用将不涉及Proto DataStore。有需要的去阅读参考文档

各种数据存储方案对比

0 引用

//启用JDK8
android{
    kotlinOptions {
        jvmTarget = '1.8'
    }
}

// Preferences DataStore
implementation "androidx.datastore:datastore-preferences:1.0.0-alpha01"


// Proto DataStore(确保已引用proto相关依赖)
implementation  "androidx.datastore:datastore-core:1.0.0-alpha01"

1 创建DataStore

	val dataStore: DataStore<Preferences> = context.createDataStore(
    	name = "settings"
	)

name由自己自定义。当首次写入数据的时候,将会自动的创建dataStore。该文件在data/data/<包名>/files/{自己定义的name}.preferences_pb

2 设置key

	private val key = preferencesKey<Int>(name = "my_counter")
  • Key的类型只能是Int, Long, Boolean, Float, String
  • name是键的名字

3 写数据

	//取DataStore的值加一后再次存入
	private suspend fun incrementCounter() {
        dataStore.edit { settings ->
            val currentCounterValue = settings[key] ?: 0
            settings[key] = currentCounterValue + 1
        }
    }
    
    btn_write.setOnClickListener {
        lifecycleScope.launch(Dispatchers.IO) {
            incrementCounter()
        }
    }

4 读数据

	private val myCounterFlow: Flow<Int> =
        dataStore.data.map { currentPreferences -> currentPreferences[key] ?: 0 }
        
	btn_read.setOnClickListener {
            lifecycleScope.launch(Dispatchers.IO) {
                myCounterFlow.collectLatest {
                    withContext(Dispatchers.Main) {
                        Toast.makeText(this@MainActivity, "$it", Toast.LENGTH_SHORT).show()
                    }
                }
            }
        }

5 从SharedPreferences合并到DataStore

    private val dataStore: DataStore<Preferences> = createDataStore(
        "settings",
        migrations = listOf(SharedPreferencesMigration(this, "sp"))
    )

传入一个migrations参数,接收一个SharedPreferencesMigration列表。

————————

简单写写,代码能跑就行。 详细看文档和源码吧