java - 如何使用 MVVM 架构上的 Room 在 android 存储库类中查询?
问题描述
我在下面有这个存储库代码,我还希望通过查询数据库(这里我使用了 Room)来返回我的购物车项目,以便它返回: Select * from cart where cartId = {{id}}
如何在 AsyncTask 上编写函数并从那里返回值?
存储库类:
package com.threedebuggers.foodrush.repositories;
import android.app.Application;
import android.os.AsyncTask;
import androidx.lifecycle.LiveData;
import androidx.lifecycle.MutableLiveData;
import com.threedebuggers.foodrush.Interface.CartDao;
import com.threedebuggers.foodrush.Objects.Cart;
import com.threedebuggers.foodrush.helpers.DatabaseClient;
import java.util.List;
import java.util.concurrent.ExecutionException;
public class CartDbRepository {
private CartDao cartDao;
private LiveData<List<Cart>> allCartItems;
public CartDbRepository(Application application) {
DatabaseClient db = DatabaseClient.getInstance(application);
cartDao = db.getAppDatabase().taskDao();
allCartItems = cartDao.getItems();
}
public LiveData<List<Cart>> getAllCartItems() {
return allCartItems;
}
public void insert(Cart cart) { new InsertCartAsyncTask(cartDao).execute(cart); }
public void update(Cart cart) {
new UpdateCartAsyncTask(cartDao).execute(cart);
}
public void delete(Cart cart) {
new DeleteCartAsyncTask(cartDao).execute(cart);
}
private static class InsertCartAsyncTask extends AsyncTask<Cart, Void, Void> {
private CartDao cartDao;
private InsertCartAsyncTask(CartDao cartDao){
this.cartDao = cartDao;
}
@Override
protected Void doInBackground(Cart... carts) {
cartDao.insert(carts[0]);
return null;
}
}
private static class UpdateCartAsyncTask extends AsyncTask<Cart, Void, Void> {
private CartDao cartDao;
private UpdateCartAsyncTask(CartDao cartDao){
this.cartDao = cartDao;
}
@Override
protected Void doInBackground(Cart... carts) {
cartDao.update(carts[0]);
return null;
}
}
private static class DeleteCartAsyncTask extends AsyncTask<Cart, Void, Void> {
private CartDao cartDao;
private DeleteCartAsyncTask(CartDao cartDao){
this.cartDao = cartDao;
}
@Override
protected Void doInBackground(Cart... carts) {
cartDao.delete(carts[0]);
return null;
}
}
}
我的 DAO 课程:
package com.threedebuggers.foodrush.Interface;
import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import com.threedebuggers.foodrush.Objects.Cart;
import java.util.List;
@Dao
public interface CartDao {
@Query("SELECT * FROM Cart")
LiveData<List<Cart>> getItems();
@Query("SELECT * FROM Cart WHERE itemId =:Id")
Cart getItemById(Integer Id);
@Insert
void insert(Cart cart);
@Delete
void delete(Cart cart);
@Update
void update(Cart cart);
}
解决方案
private class SelectCartAsyncTask extends AsyncTask<Integer, Void, Cart> {
protected Cart doInBackground(Integer...ids) {
// get item from database in background thread
return cartDao.getItemById(ids[0]);
}
protected void onPostExecute(Cart result) {
// do smth with result on main thread
}
}
此类在 API 级别 30 中已弃用。请改用标准 java.util.concurrent 或 Kotlin 并发实用程序。
在https://developer.android.com/reference/android/os/AsyncTask查看更多信息
更新
private static class SelectCartAsyncTask extends AsyncTask<Integer, Void, Cart> {
private final Consumer<Cart> callback;
private final CartDao cartDao;
public SelectCartAsyncTask(CartDao cartDao, Consumer<Cart> callback) {
this.callback = callback;
this.cartDao = cartDao;
}
protected Cart doInBackground(Integer... ids) {
// get item from database in background thread
return cartDao.getItemById(ids[0]);
}
protected void onPostExecute(Cart result) {
callback.accept(result);
}
}
在你的活动中
new SelectCartAsyncTask(getCartDao(), result -> {
// do smth with result in activity
}).execute(1);
如果您不使用 Java8,请检查https://stackoverflow.com/a/12575319/5783522
推荐阅读
- javascript - Angular 生产无法在网站上运行
- html - 如何在网站上使用基于表单的登录来实现不同的领域?
- angular - Angular 多显示器应用程序
- if-statement - Streamlabs Chatbot 对 if else "request" 执行响应
- javascript - AngularJS 架构:单仓库或多仓库
- javascript - 使用属性样式或一些内联样式技巧来设置表单占位符的样式
- sql-server - 没有游标的 T-SQL 插入和更新外键
- html - 悬停时平行四边形倾斜
- arm - 在 WEC2013 上运行旧 ARM 代码(移植到 2013)
- arrays - 对数组的每个元素进行 foreach