【问题标题】:Is it possible to use SingleLiveEvent with Room in Android?是否可以在 Android 中将 SingleLiveEvent 与 Room 一起使用?
【发布时间】:2018-07-06 05:43:04
【问题描述】:

我正在修补SingleLiveEvent。是否可以将其与 Room 数据库一起使用?我尝试使用它并得到一个构建错误说Not sure how to convert a Cursor to this method's return type。这里有什么解决方法吗?我有一个我想使用它的边缘案例!

【问题讨论】:

    标签: android android-room android-livedata


    【解决方案1】:

    SingleLiveEventMutableLiveDataLiveData。您可以使用在工作线程中调用的选择查询从 Room 返回List<LiveData<YourData>>。无需在 Room 中使用光标。获取List<LiveData<YourData>> 并在观察方法上将List<YourData> 发送到所需的类或RecyclerView。您需要光标的边缘情况是什么?

    注意:强烈建议不要使用 Cursor API,因为 它不保证行是否存在或行的值是什么 包含。仅当您已有代码时才使用此功能 需要一个游标,并且您无法轻松重构。

    但是,你可以得到它

    @Dao
    public interface MyDao {
        @Query("SELECT * FROM user WHERE age > :minAge LIMIT 5")
        public Cursor loadRawUsersOlderThan(int minAge);
    }
    

    Source

    【讨论】:

    • 在高层次上,我的边缘情况类似于当活动开始时我想检查特定数据是否存在是数据库,如果不显示用于添加该数据的片段。如果该数据存在,我想显示一个完全不同的片段,它有助于对该数据执行操作。因此,如果我在活动中为此数据添加观察者,它会被触发多次。我只想触发一次。
    • 我也不需要使用光标。当我在Dao 中使用SingleLiveEvent 作为返回类型时,会导致我提到的错误。
    • 你能分享你的实体类吗?您不是想将 LiveData 类放到 Room 中,对吧?你应该用 LiveData 包装你的数据类来更新它。
    • 没有没有。 LiveData 部分工作正常。但是观察LiveData 会导致代码在每次片段中的数据发生变化时执行。我只希望它被触发一次。我现在使用的一种解决方法是在使用 Executor 从 Room 加载值后将值发布到 SingleLiveEvent(不使用 LiveDataDao 内包装)
    • 您找到解决方案了吗?
    猜你喜欢
    • 2020-12-12
    • 2018-05-18
    • 1970-01-01
    • 2021-11-12
    • 2016-04-01
    • 2011-01-20
    • 2018-08-11
    • 2021-08-05
    • 2019-03-18
    相关资源
    最近更新 更多