gpt4 book ai didi

安卓机房 : LiveData callback of update insert?

转载 作者:IT老高 更新时间:2023-10-28 23:14:18 25 4
gpt4 key购买 nike

我有一个 Simple DAO包括CRUD功能

FeedEntryDAO.java

@Dao
public interface FeedEntryDAO {

@Query("SELECT * FROM feedEntrys")
LiveData<List<FeedEntry>> getAll();

@Query("SELECT * FROM feedEntrys WHERE uid = :uid LIMIT 1")
LiveData<FeedEntry> findByUid(int uid);

@Insert
void insertAll(FeedEntry... feedEntries);

@Delete
void delete(FeedEntry feedEntry);

@Update
int update(FeedEntry feedEntry);

}

对于 select ,返回 LiveData 类型即可。

在 Activity 内部,代码非常适合选择

viewModel.getFeedEntrys().observe(this,entries -> {...});

但是,当我尝试插入、更新、删除数据时。代码看起来有点难看,而且每次都会创建一个异步任务。

new AsyncTask<FeedEntry, Void, Void>() {
@Override
protected Void doInBackground(FeedEntry... feedEntries) {
viewModel.update(feedEntries[0]);
return null;
}
}.execute(feedEntry);

我有两个问题:

  1. 我可以使用 LiveData 来包装删除、插入、更新函数吗?
  2. 为删除、插入、更新维护此类异步任务类的更好方法?

感谢任何建议和意见。谢谢。

最佳答案

  1. Can i use LiveData to wrap Delete, Insert, Update calls?

不,你不能。我给 issue 写了一个答案.原因是 LiveData 用于通知更改。插入、更新、删除不会触发更改。它将返回已删除的行、插入的 ID 或受影响的行。即使它看起来很糟糕,不将 LiveData 包裹在你的东西上也是有道理的。无论如何,在调用周围有像 Single 这样的东西来让操作触发并在 RX-Java 操作上操作是有意义的。

如果你想触发这些调用,你会在一个选择查询中观察它,它会通知你的 LiveData onec 你已经更新、插入或删除了一些/任何数据。

  1. Better way to maintain such asynctask class for delete, insert , update?

查看您的示例后,您似乎误用了 (Model/View/)ViewModel-Pattern。您永远不应该在您的 View 中访问您的存储库。我不确定您是否这样做,因为它在您的样本中不可见。无论如何,在观察您的 LiveData 并获得结果之后,无需将 viewModel 中的数据更新包装在 AsyncTask 中。这意味着,您应该始终照顾好

a) 查看 <-> viewmodel <-> 存储库而不是查看 <-> 存储库和查看 <-> viewmodel

b) 不要尝试使用不需要的线程。默认情况下(如果未使用 @MainThread 注释),您在后台线程 (@WorkerThread) 上观察 LiveData,并在 ui 线程 (@MainThread) 中获取值。

关于安卓机房 : LiveData callback of update insert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46462128/

25 4 0