释放JetPack数据存储的功能-Kotlin:提升您的Android应用程序存储体验
#发展 #java #kotlin #android

介绍

在Android App开发领域,数据存储统治至高无上,这是需要一丝不苟的关注的关键方面。无论是涉及存储用户偏好,键值对还是键入对象,都包含强大而有效的数据存储解决方案对于提供无缝的用户体验至关重要。在这篇豪华的博客文章中,我们踏上了探索JetPack DataStore无与伦比的功能的旅程。

第1节:了解JetPack数据存储

欢迎使用JetPack DataStore的领域,这是一个独家组件,坐落在著名的Android Jetpack库中。精心策划了这种组件和工具的精英集合,以使开发人员能够轻松制作豪华的Android应用程序。在此杰出的集合中,数据存储库 - 一种富有的数据存储解决方案,该解决方案赋予开发人员使用协议缓冲区存储键值对或键入对象的能力。通过利用Kotlin Coroutines和Flow的功能,数据存储提供了异步,一致和交易数据存储功能的丰富体验。

第2节:数据存储的两个实现

数据存储通过两个不同的实现来展示其宏伟壮观:periferes datastore和proto datastore。

偏好数据存储:简单的优雅性

输入偏好世界数据存储的世界 - 简单性和优雅的实现。这种精致的实现是轻松数据存储的典范,其中数据是使用键存储和访问的。偏好数据存储不需要预定义的架构,也不需要为开发人员带来类型安全的束缚。它优雅地满足了键值对的存储需求,例如用户偏好和应用程序设置,具有最大的优雅和精致。

要创建一个首选项数据存储,请使用preferencesDataStore创建的属性委托来创建DataStore<Preferences>的实例。在Kotlin文件的最高级别上调用一次,并在整个应用程序的其余部分中通过此属性访问它。这样可以确保您的数据存储保持为单身。

// At the top level of your Kotlin file:
val Context.dataStore: DataStore<Preferences> by preferencesDataStore(name = "settings")

要从偏好数据存储中读取,请使用DataStore实例的data属性。您可以将存储的值公开为Flow并使用它来检索适当的值。

val EXAMPLE_COUNTER = intPreferencesKey("example_counter")
val exampleCounterFlow: Flow<Int> = context.dataStore.data
    .map { preferences ->
        // No type safety.
        preferences[EXAMPLE_COUNTER] ?: 0
    }

要写入首选项数据存储,请使用首选项数据存储提供的edit()函数。此功能允许您在数据存储中进行交易更新数据。您可以在变换块中访问当前值并根据需要更新它们。

suspend fun incrementCounter() {
    context.dataStore.edit { settings ->
        val currentCounterValue = settings[EXAMPLE_COUNTER] ?: 0
        settings[EXAMPLE_COUNTER] = currentCounterValue + 1
    }
}

原始数据存储:复杂性满足改进的地方

看原始数据存储的威严 - 复杂性在精致的精致中找到慰藉的领域。这种区分的实现具有将数据存储为自定义数据类型的实例的能力,该实现使用协议缓冲区精心定义。 Proto DataStore需要一种预定义的模式,在原始文件中精心制作,这赋予了强大的打字和类型安全的功能。它是将复杂和结构化数据存储在您的应用程序中的理想住所,确保了无与伦比的奢侈品水平。

要创建一个原始数据存储,涉及两个步骤:

  1. 定义一个实现Serializer<T>的类,其中T是原始文件中定义的类型。该序列化器类告诉数据存储如何读取和编写您的数据类型。确保如果尚未创建文件,请使用默认值供序列程序使用。
object SettingsSerializer : Serializer<Settings> {
    override val defaultValue: Settings = Settings.getDefaultInstance()

    override suspend fun readFrom(input: InputStream): Settings {
        try {
            return Settings.parseFrom(input)
        } catch (exception: InvalidProtocolBufferException) {
            throw CorruptionException("Cannot read proto.", exception)
        }
    }

    override suspend fun writeTo(t: Settings, output: OutputStream) = t.writeTo(output)
}
  1. 使用dataStore创建的属性代表来创建DataStore<T>的实例,其中T是原始文件中定义的类型。在您的Kotlin文件的最高级别上调用一次,并在整个应用程序的其余部分中通过此属性委托访问它。 filename参数告诉数据存储用于存储数据的文件,而serializer参数告诉数据存储在第1步中定义的序列化合程序类的名称。
val Context.settingsDataStore: DataStore<Settings> by dataStore(
    fileName = "settings.pb",
    serializer = SettingsSerializer
)

要从原始数据存储中读取,请使用数据存储实例的data属性。您可以从存储的对象中以Flow的形式公开适当的属性。

val exampleCounterFlow: Flow<Int> = context.settingsDataStore.data
    .map { settings ->
        // The exampleCounter property is generated from the proto schema.
        settings.exampleCounter
    }

要写入原始数据存储,请使用原始数据存储提供的updateData()功能。此功能在交易中更新存储的对象。它为您的数据类型提供了当前数据状态,并在Atomic Read-Write-Modify操作中通过交易来更新数据。

suspend fun incrementCounter() {
    context.settingsDataStore.updateData { currentSettings ->
        currentSettings.toBuilder()
            .setExampleCounter(currentSettings.exampleCounter + 1)
            .build()
    }
}

第3节:使用数据存储的最佳实践:拥抱优雅

确保您使用数据存储的旅程保持尽可能丰富,我们提供了一系列最佳实践,以指导您实现真正的豪华体验:

  1. 拥抱奇异性:在同一过程中,为给定文件创建一个超过一个数据存储的实例。从这个独家原则中流传会破坏数据存储的基础,从而导致意外的并发症。让奇异性成为保留其真正本质的指导原则。
  2. 不变的宏伟:数据存储中使用的通用类型必须散发出不变性的光环。提防突变的危险,因为它们会破坏数据存储的神圣性并引起危险的错误。为了保持最高的奢侈品标准,我们强烈建议使用协议缓冲区 - 不变性,简单性和有效序列化的缩影。
  3. MultiprocessDatastore:对于那些寻求从多个过程访问数据存储的人,沉迷于多进程Datastore的奢侈产品。避免使用同一文件的单个ProcoSessDatastore和MultiprocessDatastore的使用,因为这样的大胆会导致数据不一致和其他不良后果。

第4节:在您的应用程序中设置数据存储:豪华事件

准备与JetPack DataStore的豪华事件的Android应用程序需要在Gradle文件中包含最好的依赖项。取决于您首选的实现 - 偏好数据存储或原始数据存储 - 确保用适当依赖项装饰您的应用程序build.gradle文件。

对于偏好数据存储,沉迷于以下辉煌:

dependencies {
    implementation "androidx.datastore:datastore-preferences:1.0.0"
    // Optional - Revel in the opulence of RxJava2 support
    implementation "androidx.datastore:datastore-preferences-rxjava2:1.0.0"
    // Optional - Bask in the grandeur of RxJava3 support
    implementation "androidx.datastore:datastore-preferences-rxjava3:1.0.0"
}

对于原始数据存储

dependencies {
    implementation "androidx.datastore:datastore:1.0.0"
    // Optional - Revel in the opulence of RxJava2 support
    implementation "androidx.datastore:datastore-rxjava2:1.0.0"
    // Optional - Bask in the grandeur of RxJava3 support
    implementation "androidx.datastore:datastore-rxjava3:1.0.0"
}

第5节:结论:大结局

当我们在Jetpack DataStore的领域结束这一奢侈的旅程时,我们邀请您陶醉于等待的富裕。探索这个豪华的数据存储库的无限可能性,毫不费力地简单性和精致。通过拥抱最佳实践并利用数据存储提供的独特功能,您可以确保您的Android应用在其数据存储功能上散发出优雅和奢华感。释放JetPack数据存储的功能,并将您的应用程序存储体验提升到Grandeur的新高度。