繁体   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