首页 > 解决方案 > 如何使用 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);


}

标签: javaandroidandroid-roomandroid-mvvm

解决方案


 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


推荐阅读