0

我的应用架构,很常见:

在此处输入图像描述

如果我有实体列表,请解释我,例如

@Entity(tableName = TABLE_NAME)
    class Item constructor(
            @PrimaryKey(autoGenerate = false) 
            var id: Long = 0L,
            @TypeConverters(ListToStringConverter::class)
            var eventDescription: List<String> = emptyList(),
            @TypeConverters(DateConverter::class)
            var date: Date = Date(),
            var rate: Int ?= null)

图片说明:

目前我做(根据上图):

  1. mLiveData从存储库获取LiveData
  2. 打回来refreshFromDataBase()
  3. mLiveData.addSource来自LiveData数据库 - 是什么导致 Android 视图快速更新
  4. 打回来refreshFromNetwork()
  5. 休息更新数据库表
  6. 数据库插入导致 LiveData 添加将更改推送到视图

问题的形成

5 步的最佳实践是什么 - 当新数据出现而我必须用最新数据替换旧数据时?

目前我正在使用 RxJava、Room、Kotlin,并且我在第 3 步中使用了嵌套的 Rx.Single,这是非常难看的意大利面条代码。

喜欢

disposable = usecase.getDataFromNetwork()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeBy(onSuccess = {      
                    val itemsList = it
                    dataBase.deleteAllItems()
                            .subscribeOn(Schedulers.io())
                            .observeOn(AndroidSchedulers.mainThread())
                            .subscribeBy (onComplete = {                                                          dataBase.insertNewItems(itemsList)
                                            .subscribeOn(Schedulers.io())
                                            .observeOn(AndroidSchedulers.mainThread())
                                            .subscribeBy(onComplete = {
                                                // Process complete
                                            }, onError = {
                                                ...
                                            })
                                }
                            }, onError = {
                                ...
                            })
                }, onError = {
                    ...
                })

丑陋的意大利面条代码。

问题

  • 我应该在插入新项目之前擦除所有表格吗?Livedata 监听 List 的变化,所以每当有任何变化(一些项目更新,一些插入,一些删除)视图都会更新
  • 在我所有的 Streams 都是 Single 的情况下(原因:它们在 onComplete 时自行处理),如何按顺序链接它们以限制一个流规则?
4

1 回答 1

0

这取决于您获取的数据是否相似。如果您的新数据通常完全不同,我会删除所有元素,然后仅使用一种方法插入新元素,如下所示:

@Insert
public void insertItems(Item... items);

如果您的新数据相似并且您不关心他们的订单,我会将所有新项目与旧项目进行比较,以了解每个项目是否需要更新、插入或删除项目。最后调用 deleteItems(itemsToDelete)、updateItems(itemsToUpdate) 和 insertItems(itemsToInsert)。这三种方法与上面编写的方法相似,但使用了@Delete、@Update 和@Insert。

如果您关心订单,我建议您查看Android 分页库并创建一个自定义数据源,您可以在其中告诉实时数据何时更新其值。一些链接开始:this , this , thisthis

于 2017-11-21T18:27:53.777 回答