当前位置: 首页 > 知识库问答 >
问题:

如何在Android仓库类内查询使用MVVM架构上的房间?

孙言
2023-03-14

我在下面有一个存储库代码,在这里我还希望有一个函数,通过查询数据库(这里我使用了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);


}

共有1个答案

臧友樵
2023-03-14
 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(并对代码进行相应的修改)