【问题标题】:Non-Duplicating Entries in Room Database from Network Call来自网络呼叫的房间数据库中的非重复条目
【发布时间】:2018-08-12 14:18:16
【问题描述】:

我从 api 调用中获取 json 数据并将其保存在房间数据库中。数据保存成功,我可以在我的 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:\t" + 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:\t" + 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);

 }

【问题讨论】:

    标签: java android database duplicates android-room


    【解决方案1】:

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

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

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

    • 考虑使用OnConflictStrategy.IGNORE,如果它保证具有相同ID的产品不会改变。

    【讨论】:

    • 我已经编辑了这个问题。请再看看。谢谢
    • 我观察到你的 dao 接口直接使用模型,但我使用的是模型类的列表。如果我改变了我的,它还会保存我模型类的多个对象吗?
    • 不,我认为是一样的,请务必在重试之前清除应用数据。
    • 我已经这样做了,但是当我重新加载该活动时,条目会重复。
    • 有没有办法比较和过滤列表本身的值或在函数中返回布尔值来保存产品?
    猜你喜欢
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2019-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    相关资源
    最近更新 更多