房间数据库多次交易

Room database multiple transactions

我正在使用 Room 构建一个杂货清单应用程序,需要在包含我的 Dao 对象的列表中进行多次更新。我如何 运行 在我的对象列表中进行多次更新?我应该 运行 它们在一个线程中还是我必须为每个对象更新创建多个线程?我目前遇到的问题是,只有列表中的第一个对象得到正确更新,而其他对象被设置为 checked = false 但 listed = true。一旦线程完成所有事务更新,activity 应该重新加载。我正在使用 AsyncTaskLoader,谢谢!

杂货店 DAO

package data;

import android.arch.persistence.room.Dao;
import android.arch.persistence.room.Delete;
import android.arch.persistence.room.Insert;
import android.arch.persistence.room.Query;
import android.arch.persistence.room.Update;

import java.util.List;

/**
 * The {@link Dao} class to run CRUD operations on the database.
 */
@Dao
public interface GroceryItemDao {

    @Query("SELECT * FROM GroceryItem")
    List<GroceryItem> getAllGroceries();

    @Query("SELECT * FROM groceryitem WHERE is_listed = 1")
    List<GroceryItem> getAllListedGroceries();

    @Update
    void updateGrocery(GroceryItem groceryItem);

    @Insert
    void insertGroceryItem(GroceryItem groceryItem);

    @Delete
    void delete(GroceryItem groceryItem);
}

加载器class

package loaders;

import android.content.AsyncTaskLoader;
import android.content.Context;
import android.util.Log;

import java.util.List;

import data.AppDatabase;
import data.GroceryItem;

import static utils.Constant.IS_CHECKED_FALSE;
import static utils.Constant.IS_LISTED_FALSE;

public class GroceryLoaderUpdate extends AsyncTaskLoader {

    public static final String TAG = "GroceryLoaderUpdate";

    private List<GroceryItem> groceryItems;
    private AppDatabase db;

    public GroceryLoaderUpdate(Context context, List<GroceryItem> groceryItems) {
        super(context);
        this.groceryItems = groceryItems;
    }

    @Override
    protected void onStartLoading() {
        forceLoad();
    }

    @Override
    public Object loadInBackground() {

        db = AppDatabase.getAppDataBase(GroceryLoaderUpdate.this.getContext());

        for (GroceryItem current : groceryItems) {

            if (current.isChecked()) {

                current.setChecked(IS_CHECKED_FALSE);
                current.setListed(IS_LISTED_FALSE);

                db.groceryItemDao().updateGrocery(current);
            }
        }
        return null;
    }
}

您可以使用

更新多个对象

@Update public void updateGroceries(GroceryItem... groceryItem);

然后

db.groceryItemDao().updateGroceries(groceryItems.toArray(new GroceryItem[groceryItems.size()]));