安卓/科特林/Jetpack 撰寫:使用原型數據存儲

https://medium.com/@2018.itsuki/android-kotlin-jetpack-compose-using-proto-datastore-2f1a1041bc70

Android/Kotlin/Jetpack Compose 使用 Proto DataStore

設定

將以下依賴項目和指令新增至您的 build.gradle.kts(Project:) 與 build.gradle.kts(Module:app)。文章中也包含 org.jetbrains.kotlin.plugin.serialization 插件,以供稍後處理自訂資料類別使用。

build.gradle.kts(Project:)

buildscript{
dependencies {
classpath(“com.google.protobuf:protobuf-gradle-plugin:0.9.4”)
}
}

build.gradle.kts(Module:app)

請注意:我知道在官方文件中,他們並未提到要新增 com.google.protobuf,但實際上在建置專案時是絕對需要的,以便產生 proto 語言類別。

定義模式

Proto DataStore 需要預先定義在 app/src/main/proto/ 目錄下的 proto 檔案。在該目錄下新增 .proto 檔案,我命名為 MyUserInfo.proto。

應該會得到類似以下的目錄結構。

我們的 .proto 檔案將包含定義在 Proto DataStore 中儲存的物件類型。

我們先從簡單的開始,看看 proto 檔案的一些重要部分。

java_package

我要讓您特別留意的第一件事是 java_package。這定義了我們將放置序列化器(Serializer)的目錄,它告訴 DataStore 如何讀取和寫入我們的資料類型。

它應該是您應用的命名空間 + 一些目錄名稱。

message

message 之後是您的資料類型名稱,在我的例子中是 MyUserInfo。

在 message 區塊中,我們將擁有一系列我們希望儲存的欄位。我有一個字串類型的使用者名稱和 int32 類型的年齡。

1 和 2 是在欄位宣告後面的欄位號碼。我們必須給定每個訊息定義中的欄位一個介於 1 到 536,870,911 之間的號碼,並需要符合以下限制:

在訊息中獨一無二。

欄位號碼 19,000 到 19,999 保留給 Protocol Buffers 實作。若我們在訊息中使用了這些保留的欄位號碼,proto 編譯器將會發出警告。

我們不應該使用已經被保留的欄位號碼或分配給擴充的欄位號碼。

欄位號碼不應重新使用。

注意:我們存儲物件的類別是從 proto 檔案中定義的訊息在編譯時產生的。請確保每次修改 proto 檔案後重新建置專案。

如需了解更多有關定義 proto 模式的資訊,請查看 Protocol Buffers 語言指南。

實作序列化器

由於我指定了我的 java_package 為 com.example.protodatastoredemo.util,我將先建立一個 util 包裡的 DataStoreSerializer.kt,我們將在其中定義 DataStore 如何讀取和寫入我們的資料類型。

請確保為序列化器包含一個 defaultValue,以供尚未建立檔案時使用。

讀取和寫入簡單資料類型

先來看看如何讀寫簡單的資料類型,例如字串和整數。

我已定義一個物件以處理讀取和寫入,以方便我自己。

從 Proto DataStore 讀取

DataStore.data 提供了我們存儲物件中屬性的 Flow。然而,大部份時間我們不需要一個 Flow;我們只需要一個單一值,以下是如何做到的。我將以使用者名稱為例。

寫入至 Proto DataStore

Proto DataStore 提供了一個 updateData() 函式,用於事務性更新存儲物件。updateData() 函式會給我們當前存儲物件的狀態作為我們的資料類型實例,並以原子讀-寫-修改操作交易性更新資料。

我們可以像下方這樣使用它,以使用者名稱為例。

讀寫自訂類別類型

現在,讓我們看看如何使用 Kotlin 序列化來讀寫自訂類別。

首先,讓我們定義一個 ExtraInfo 資料類別。

非常重要的是確保這個類別是不可變的。

DataStore 不兼容可變類型,使用可變類型將會導致由於資料不一致和競爭狀況而導致的程式錯誤。

這就是使用 val 取代 var !

我們也將在我們的 Data Store 中新增一個 extraInfo 欄位。

讀寫

它將幾乎與上面的一樣,除了多了一個將 Json 字串解碼和編碼的步驟,如下所示。

接著我們可以使用上述函式,就像我們對簡單資料類型所做的一樣。

via Android App Development on Medium

March 24, 2024 at 07:54AM

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *