来自网络调用的房间数据库中的非重复条目
Non-Duplicating Entries in Room Database from Network Call
我正在从 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);
}
在你的Dao插入方法中添加onConflict
@Insert(onConflict = OnConflictStrategy.REPLACE)
public void insertProduct(Product product);
这样如果添加了相同id的产品,不同的数据会更新。并且您最终不会得到重复的行。
- 如果可以保证具有相同 ID 的产品不会发生变化,请考虑使用
OnConflictStrategy.IGNORE
。
我正在从 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);
}
在你的Dao插入方法中添加onConflict
@Insert(onConflict = OnConflictStrategy.REPLACE)
public void insertProduct(Product product);
这样如果添加了相同id的产品,不同的数据会更新。并且您最终不会得到重复的行。
- 如果可以保证具有相同 ID 的产品不会发生变化,请考虑使用
OnConflictStrategy.IGNORE
。