[英]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
接口並創建諸如RoomDataSourceImpl
或DataStoreSourceImpl
的實現,以保留本地數據但僅將 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.