- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我有一个 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);
我有两个问题:
感谢任何建议和意见。谢谢。
最佳答案
- Can i use LiveData to wrap Delete, Insert, Update calls?
不,你不能。我给 issue 写了一个答案.原因是 LiveData 用于通知更改。插入、更新、删除不会触发更改。它将返回已删除的行、插入的 ID 或受影响的行。即使它看起来很糟糕,不将 LiveData 包裹在你的东西上也是有道理的。无论如何,在调用周围有像 Single 这样的东西来让操作触发并在 RX-Java 操作上操作是有意义的。
如果你想触发这些调用,你会在一个选择查询中观察它,它会通知你的 LiveData onec 你已经更新、插入或删除了一些/任何数据。
- 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/
我是一名优秀的程序员,十分优秀!