簡體   English   中英

Jetpack 數據存儲:性能注意事項

[英]Jetpack Datastore: performance considerations

我正在創建一個 jetpack compose android 應用程序,並且需要一些持久數據——看起來 jetpack DataStore 是到 go 的正確方法。

對於我的應用程序,我將有一個文本列表(比方說 20 個文本,所有 10 個段落長),並且文本也有元數據(例如,標題)。 我試圖決定我的數據存儲的架構,但找不到太多關於它的性能特征的信息。 我正在閱讀 aobut proto buffers ,但以前從未使用過它們。

無論如何,這種架構(使用粗略的偽代碼)是否合理:

type Texts = Map(uuid -> Text) # top level store in my DataStore

object Text {
   metatadata: {
      name: string,
      author: string
      preview: string   
   },
   textContent: long string or array of long strings
}

我是否能夠將 map 加到 Map 的值上,並提取所有元數據以顯示在主屏幕上——而不會產生閱讀所有大文本內容的成本? 或者我是否需要不同的頂級數據結構(一種用於文本元數據,一種用於文本內容)? 具體來說,我能否高效地僅訂閱Composable中的嵌套元數據?

無論您喜歡哪種數據存儲系統,或者您可以同時使用兩者,您都可以通過使用接口的依賴倒置並通過 DI 框架注入它來實現。

您可以創建一個TextDataSource接口並創建諸如RoomDataSourceImplDataStoreSourceImpl的實現,以保留本地數據但僅將 TextDataSource 公開給您的 Repository/UseCase/ViewModel。

而且,是的,通過使用 select 從房間數據庫創建 Flow,只要您的數據發生變化,您就可以更新 Flow。

在您的Dao接口中聲明下面的 function

   /**
     * get list of [TextEntity] as [Flow]
     */
    @Query("SELECT * FROM table_text")
    fun getTextsFlow(): Flow<List<TextEntity>>

在您的 ViewModel 或 Composable 內部轉換此流或使用Flow.collectAsState()擴展將其收集為State或將其更改為您的自定義 ui state 例如

@Immutable
data class UiState<T>(
    val status: Status,
    val data: T? = null,
    val error: Throwable? = null
)

我收集它作為

/**
 * Get texts as [Flow] of [UiListState]
 */

val uiListState: Flow<UiListState<Text>> = textListUseCase
.getTextsFlow()
.map {
    when (it) {
        is Result.Error -> {
            UiListState(status = Status.ERROR, error = it.exception)
        }

        is Result.Success -> {
            UiListState(status = Status.SUCCESS, data = it.data)
        }

        else -> UiListState(status = Status.IDlE)
    }
}
.flowOn(dispatchers.defaultDispatcher)
.onStart {
    this.emit(UiListState(status = Status.LOADING))
    delay(1000)
}

UseCase 僅用於執行業務邏輯,如果不需要可以跳過。

下面的官方文檔解釋了 UseCase 和領域層。

https://developer.android.com/topic/architecture/domain-layer

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM