【问题标题】:Room database multiple transactions房间数据库多笔交易
【发布时间】:2018-10-03 01:46:31
【问题描述】:

我正在使用 Room 构建一个购物清单应用程序,并且需要在包含我的 Dao 对象的列表中进行多次更新。如何在我的对象列表中运行多个更新?我应该在单个线程中运行它们还是必须为每个对象更新创建多个线程?我目前遇到的问题是,只有列表中的第一个对象得到正确更新,其他对象被设置为选中 = false 但列出 = true。一旦线程完成所有事务更新,活动应该重新加载。正在使用 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);
}

加载器类

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;
    }
}

【问题讨论】:

  • 我不明白你的问题。这意味着不将数据更新到数据库或列表中。如果两个更新都没有在 listview 或 recyclerview 中显示更新的数据。

标签: java android android-room asynctaskloader


【解决方案1】:

你可以更新多个对象

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

然后

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-19
    • 2016-03-17
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2012-08-30
    • 1970-01-01
    相关资源
    最近更新 更多