SaveAllInBackground không hoạt động bên trong deleteAllInBackground như mong muốn.SaveAllInBackground không hoạt động bên trong deleteAllInBackground như mong muốn
Tôi đang cố gắng lưu một danh sách các phân tích cú pháp bằng cách lưu tất cả trong nền. Để tránh trùng lặp trong bảng, tôi đang truy vấn các hàng đã tồn tại và xóa chúng nếu có và sau đó lưu bản sao mới. Vì vậy, tôi đang gọi saveAllInBackground bên trong lời gọi lại của deleteAllInBackground.
Vấn đề là thế này:
Đối với ví dụ: nếu danh sách xóa chứa [a, b, c, d] và danh sách tải lên có [a, b, c, d, e, f] chỉ [e, f] được phân tích để phân tích cú pháp. Tôi đang đi qua [a, b, c, d, e, f] đến saveAllInBackground nhưng chỉ [e, f] được duy trì.
Tôi đang thiếu cái gì? Làm thế nào để giải quyết điều này?
Tôi có thể sử dụng một cách tiếp cận khác không?
Có cách nào tốt hơn để tránh trùng lặp không? Tôi không muốn thêm beforeSave hook. Toàn bộ mục đích gọi là saveAll là giảm số lượng các cuộc gọi API. Tôi đoán nếu tôi sử dụng beforeSave, tôi sẽ phải chạy một số truy vấn trong mã đám mây anyway.
Đây là mã của tôi
ParseQuery query = new ParseQuery("PostChoice");
query.fromPin();
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(final List<ParseObject> localList, ParseException e) {
if (localList != null && !localList.isEmpty()) {
List<ParseObject> postList = new ArrayList<ParseObject>();
for (ParseObject object : localList) {
postList.add(object.getParseObject("post"));
}
ParseQuery query = new ParseQuery("PostChoice");
query.whereContainedIn("post", postList);
query.whereEqualTo("user", ParseUser.getCurrentUser());
query.findInBackground(new FindCallback<ParseObject>() {
@Override
public void done(List<ParseObject> parseCloudList, ParseException e) {
if (parseCloudList != null && !parseCloudList.isEmpty()) {
ParseObject.deleteAllInBackground(parseCloudList, new DeleteCallback() {
@Override
public void done(ParseException e) {
// this gets executed and rows are accordingly deleted
ParseObject.saveAllInBackground(localList, new SaveCallback() {
@Override
public void done(ParseException e) {
// this gets executed but the rows are not uploaded.
//the locallist is not empty. it contains the right data.
editor.putLong(Four.LAST_CHOICE_SYNC_TIME, System.currentTimeMillis());
editor.commit();
Log.i("SyncChoiceService", "Synced Choices");
}
});
}
});
}
else{
ParseObject.saveAllInBackground(localList, new SaveCallback() {
@Override
public void done(ParseException e) {
Log.i("SyncChoiceService", "Synced Choices");
editor.putLong(Four.LAST_CHOICE_SYNC_TIME,System.currentTimeMillis());
editor.commit();
}
});
}
}
});
}
}
});
Chúng ta không thể làm điều này nếu không có cờ? cờ trong thời gian dài trở thành một chi phí. Tôi thích giữ các cột ở mức tối thiểu và xử lý logic trong mã. – 55597
Đây là phương pháp tôi sẽ sử dụng, vì những lý do đã đề cập. Nhưng chi phí của các điểm danh tiếng của tôi tôi không muốn giúp bạn. –