android Jetpack数据存储:效能考量

p8h8hvxi  于 2022-11-27  发布在  Android
关注(0)|答案(1)|浏览(120)

我正在创建一个jetpack compose android应用程序,并且需要一些持久性数据-看起来jetpack DataStore是正确的选择。
对于我的应用程序,我将有一个文本列表(假设有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
}

我是否能够MapMap的值,并提取所有元数据,以便在主屏幕上显示,而不会产生阅读所有大型文本内容的成本?或者我是否需要不同的顶级数据结构(一个用于文本元数据,另一个用于文本内容)?具体来说,我是否可以在性能上仅订阅Composable中的嵌套元数据?

pcww981p

pcww981p1#

无论你喜欢哪种数据存储系统,或者你可以同时使用这两种系统,你都可以通过使用接口的依赖关系反转并通过DI框架注入它来实现。
您可以创建一个TextDataSource接口,并创建RoomDataSourceImplDataStoreSourceImpl这样的实现,以保留本地数据,但只向Repository/UseCase/ViewModel公开TextDataSource。
而且,是的,通过从房间数据库创建一个流,选择任何时候你的数据改变,你可以更新流。
Dao接口中声明下面的函数

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

在ViewModel或Composable中转换此流或将其收集为带有Flow.collectAsState()扩展State,或将其更改为自定义ui状态,例如

@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)
}

用例仅用于执行业务逻辑,如果不需要,可以跳过它。
下面的官方文档解释了用例和域层。
https://developer.android.com/topic/architecture/domain-layer

相关问题