我刚刚完成了有关Room Database的代码实验室课程,但似乎无法将数据加载到表中。
我已将课程应用于我的项目。我的项目在recyclerview中显示了一堆项目,当用户按下recyclerview中的一个项目按钮时,该项目将被添加到Room数据库中创建的表中。
我已经使用sqlite db资源管理器打开了Room数据库,其中包含设备资源管理器中的文件。我可以看到数据库以及要插入的表均已创建,但是表中没有数据。
这是来自onBindViewHolder,用于我的recyclerview
holder.QtyAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Code to build product
new PopulateDB(RoomDatabase.getDatabase(context), product);
}
});
我已经检查并确保产品不为空。
这是用于填充数据库的AsyncTask,也位于adpater中
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;
}
}
这是我的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();
}
我正试图在购物车片段中显示此表数据,并且我正在使用此方法在数据准备好后显示它。
cartViewModel.getAllCartItems().observe(this, new Observer<List<Product>>() {
@Override
public void onChanged(@Nullable List<Product> products) {
cartAdapter.setProductCartList(products);
}
});
我已经检查了此适配器,列表大小为0。
如果您需要更多信息,请务必询问, 谢谢您的时间/
答案 0 :(得分:3)
new PopulateDB(RoomDatabase.getDatabase(context), product);
您正在创建AsyncTask
。您永远不会执行它,因此您的doInBackground()
未被运行。您可以通过在doInBackground()
中放置断点或向doInBackground()
添加日志记录来进行测试。
要解决此问题,请execute()
您的AsyncTask
。
此外,请注意,由于您未使用onPostExecute()
,因此与使用任何其他线程解决方案(AsyncTask
,Thread
相比,此处使用Executor
的价值很小。 ,RxJava等)。