我在下面有一个存储库代码,在这里我还希望有一个函数,通过查询数据库(这里我使用了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;
}
}
}
我的刀课:
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或静态编程语言并发实用程序。
更多信息请访问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
所以我遵循MVVM架构,在那里我有一个银行交易数据库: 我的Dao类有两个查询: 仓库: 视图模型: 在主片段中,我正在用数据库中的所有事务填充回收视图: 我的问题是:如何从DAO调用函数 要填充相同的recyclerView(当按下某个按钮时)?我不能吃这样的东西 在我的DAO中,因为查询应该在另一个线程上执行(我不允许在主线程上执行),所以我的DAO不能返回事务列表<你能提供帮助吗?
我正在探索新的Android架构组件,并希望将其实现到一个Android应用程序中。当我在iOS开发中使用MVVM时,我对MVVM非常了解。阅读了Google提供的Android Architecture Components guide:https://developer.Android.com/topic/libraries/Architecture/guide.html 我有几个问题...
我是新来的和我试图我的得到一个从它。我试图这样做的它与这是id但问题是我不知道如何返回目标从。 这就是<代码>刀 这是Repository类
我正在使用我的房间持久性库来访问数据库数据。 在我的道课上,我把查询写成 这很好。但是,如果我必须将状态与某个常量值进行比较,例如状态!=Constant.STATUS_FAILED 这里,val STATUS_FAILED=5在常量文件中定义。 我如何在查询中使用它。我知道我可以在allContacts方法中将它作为参数传递,并使用like status!= :stts。但是我不想那样。有没有什
我在我的应用程序中使用了Room DB,我想在查询中将列名作为变量,这样我就可以“在运行中”(在调用该方法时)对其进行操作。 示例代码(“name”假设是一个变量,表示一列): 我试过了,但它没有编译,错误是它需要获取一个列而不是一个字符串。 有没有办法把一个列作为变量?
我正在尝试获取消息的地图,作者id键如下: 这是我尝试过的: MessageViewModel.getAll()方法返回: 然后我将其转换为一个可流动的流(Flowable::fromIterable),这样它可以一次发出一个项目,而不是整个列表,然后我使用“toMultiMap”进行映射 on成功方法从不被调用,我不知道这里出了什么问题。如果我不使用toMultiMap(并对代码进行相应的修改)