插入数据后房间数据库表还是空的

Dem*_*218 1 android android-room

我刚刚完成了 Room Database 的 codelab 课程,但似乎无法将数据加载到表中。

我已将课程应用到我的项目中。我的项目在 recyclerview 中显示了一堆项目,当用户在 recyclerview 中的一个项目上按下按钮时,它意味着被添加到在 Room 数据库中创建的表中。

我已经使用 sqlite db explorer 和设备资源管理器中的文件打开了 Room db。我可以看到已创建数据库以及我尝试插入的表,但表中没有数据。

这是来自 onBindViewHolder 用于我的回收视图

holder.QtyAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                //Code to build product
                new PopulateDB(RoomDatabase.getDatabase(context), product);
            }
        });
Run Code Online (Sandbox Code Playgroud)

我已经检查并确保产品不为空。

这是用于填充数据库的 AsyncTask,也在适配器中

private static class PopulateDB extends AsyncTask<Void,Void,Void>{

        private final CartDao cartDao;
        private final Product product;

        PopulateDB(RoomDatabase database, Product product){
            cartDao = database.CartDao();
            this.product = product;
        }

        @Override
        protected Void doInBackground(Void... voids) {
            cartDao.insert(product);
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是我的 DAO

@Dao
public interface CartDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insert(Product productCart);

    @Query("DELETE FROM promotion_cart")
    void clearCart();

    @Query("SELECT * from promotion_cart")
    LiveData<List<PromotionProduct>> getAllPromotionCartItems();
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试在购物车片段中显示此表数据,并且我正在使用此方法在准备好后显示数据。

cartViewModel.getAllCartItems().observe(this, new Observer<List<Product>>() {
            @Override
            public void onChanged(@Nullable List<Product> products) {
                cartAdapter.setProductCartList(products);
            }
        });
Run Code Online (Sandbox Code Playgroud)

我检查了这个适配器,列表大小为 0。

如果您需要更多信息,请询问,谢谢您的时间/

Com*_*are 6

new PopulateDB(RoomDatabase.getDatabase(context), product);
Run Code Online (Sandbox Code Playgroud)

您正在创建一个AsyncTask. 你永远不会执行它,所以你doInBackground()没有被运行。你可以通过把一个断点在测试这个doInBackground()或添加日志记录doInBackground()

要修复它,execute()您的AsyncTask.

另外,请注意,由于您没有使用onPostExecute(),因此AsyncTask与使用任何其他线程解决方案(ThreadExecutor、 RxJava 等)相比,在此处使用几乎没有价值。