网络呼叫中的房间数据库中的非复制条目

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络呼叫中的房间数据库中的非复制条目相关的知识,希望对你有一定的参考价值。

我从api调用中获取json数据并将其持久保存在db。数据保存成功,我可以正确地在我的Recyclerview中显示它。

重新打开应用程序时会出现此问题。由于数据来自网络调用,因此重新获取相同的数据并再次将其重新保存在数据库中。

这是我获取和保存数据到房间数据库的代码:

    private void saveAllProducts() {
    androidNetworking.get(Constants.ALL_PRODUCTS_ENDPOINT)
            .setTag("Find All Products")
            .setPriority(Priority.HIGH)
            .build()
            .getAsJSONObject(new JSONObjectRequestListener() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, "All Products Response:	" + response.toString());
                    saveProductsList = new ArrayList<>();

                    try {
                        JSONObject jsonObject = new JSONObject(response.toString());
                        JSONArray data = jsonObject.getJSONArray("products");

                        for (int d = 0; d < data.length(); d++) {
                            JSONObject allProductsObject = data.getJSONObject(d);

                            String id = allProductsObject.getString("_id");
                            String title = allProductsObject.getString("title");
                            String slug = allProductsObject.getString("slug");
                            String price = allProductsObject.getString("price");
                            String desc = allProductsObject.getString("desc");
                            String category = allProductsObject.getString("category");
                            String image = allProductsObject.getString("image");

                            Products products = new Products();
                            products.setProductId(id);
                            products.setProductName(title);
                            products.setProductDesc(desc);
                            products.setCategory(category);
                            products.setProductPrice(price);
                            products.setImage(image);

                            saveProductsList.clear();
                            saveProductsList.add(products);

                            Log.d(TAG, "Saved List Size:	" + saveProductsList.size());

                        }


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                    /**
                     *  Code block to save products
                     * */

                    ProductsDatabase database = 
  ProductsDatabase.getInstance(getBaseContext());

  database.getProductsDAO().insertAllProducts(saveProductsList);


                }

                @Override
                public void onError(ANError anError) {

                }
            });
}

我想每次都用新数据更新数据库,但也不要复制现有数据。在保存到房间之前,是否可以计算和删除列表中的重复项?我怎么解决这个问题?谢谢

这是我的DAO界面:

@Dao
public interface ProductsDAO {

     @Query("Select * from products")
     List<Products> getAllProducts();

     @Query("Select * from products where category = :category LIMIT 1")
     Products findByCategory(String category);

     @Insert(onConflict = OnConflictStrategy.IGNORE)
     void insertAllProducts(List<Products> productsList);

 }
答案

在你,Dao中添加onConflictin的插入方法

@Insert(onConflict = OnConflictStrategy.REPLACE)
public void insertProduct(Product product);

这样,如果添加了具有相同id的产品,则会更新不同的数据。并且你不会最终得到重复的行。

  • 如果确保具有相同id的产品不会改变,请考虑使用OnConflictStrategy.IGNORE

以上是关于网络呼叫中的房间数据库中的非复制条目的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 删除数据表中的重复条目? [复制]

从活动中调用片段中的非静态方法?

从 RecyclerView 中删除房间条目

如何将Pandas中的非零条目转换为带有列表的dict?

android房间数据库KOTLIN中的级联删除

消除链接到查询结果的重复表单条目