2015-06-23 32 views
7

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(); 
             } 
            }); 
           } 
          } 
         }); 


        } 
       } 
      }); 

Trả lời

1

tôi đã đưa ra một giải pháp như thế này. và nó đáp ứng yêu cầu của tôi. Tôi sử dụng updatedValue và xóa những cái cũ và phần còn lại được cập nhật dưới dạng toàn bộ danh sách.

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.whereLessThan("updatedAt",System.currentTimeMillis()); 
         query.whereEqualTo("user", ParseUser.getCurrentUser()); 
         query.findInBackground(new FindCallback<ParseObject>() { 
          @Override 
          public void done(final List<ParseObject> parseCloudList, ParseException e) { 
           if (parseCloudList != null && !parseCloudList.isEmpty()) { 
            ParseObject.deleteAllInBackground(parseCloudList, new DeleteCallback() { 
             @Override 
             public void done(ParseException e) { 
              Log.i("SyncChoiceService", "Deleted old Choices"); 

             } 
            }); 
           } 


            } 
           }); 


ParseObject.saveAllInBackground(localList, new SaveCallback() { 
     @Override 
     public void done(ParseException e) { 
      Log.i("SyncChoiceService", "Synced Choices"); 
     } 
    }); 

        } 
       } 
      }); 
-1

Vâng, nếu tôi hiểu bạn một cách chính xác mà bạn muốn lưu dữ liệu chỉ mới từ localdb để phân tích phụ trợ.

Giải pháp tốt nhất và ít yêu cầu hơn là có trường phản chiếu trong bảng của bạn có tên là "Nháp" hoặc "isUpdated" (tên bạn muốn). Vai trò của lá cờ này là để xác định liệu lĩnh vực này được lưu trong phụ trợ hay không. nếu một lĩnh vực mới của nó "isUpdated" là sai khác đúng của nó. Sau đó, trong truy vấn bạn có thể truy vấn chỉ isUpdated là sai. Sau đó lưu chúng trong backend. Sau đó,

  1. Bạn không muốn xóa bất kỳ dữ liệu nào.
  2. Giảm yêu cầu
  3. Ít logic không cần thiết hơn trong mã của bạn.
  4. nó sạch

Hope this helps

+0

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

+0

Đâ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. –

Các vấn đề liên quan