[英]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.