2011-07-05 45 views
14

Tôi đang viết Trình ContentProvider của riêng mình sẽ được đồng bộ hóa với dịch vụ web bằng SyncAdapter.Ngăn vòng lặp đồng bộ hóa mạng khi đồng bộ hóa từ mạng trong Android ContentProvider

Sự cố xảy ra khi bộ điều hợp đồng bộ sửa đổi dữ liệu của nhà cung cấp nội dung mà nhà cung cấp kích hoạt đồng bộ hóa mạng khi gọi nội bộ getContentResolver(). NotifyChange gây ra vòng lặp đồng bộ hóa.

Thông báoChange với cờ đồng bộ hóa mạng là bắt buộc khi ứng dụng khách thực hiện sửa đổi nhưng nên tránh khi bộ điều hợp đồng bộ sửa đổi.

Làm cách nào để có thể sử dụng ứng dụng khách, điều này sẽ kích hoạt đồng bộ hóa mạng khi sửa đổi) hoặc bằng bộ điều hợp đồng bộ hóa (không nên kích hoạt đồng bộ hóa mạng).

Hiện tại tôi đang sử dụng CONTENT_URI khác nhau (bộ điều hợp đồng bộ truy cập dữ liệu bằng cách sử dụng CONTENT_URI_NO_SYNC và ứng dụng khách bằng CONTENT_URI) để có thể phân biệt giữa hai loại quyền truy cập và đặt cờ đồng bộ hóa mạng cho phù hợp.

Trả lời

34

Xem this video về cách sử dụng API REST trong SyncAdapter s.

Phương pháp mà họ thảo luận là thêm một bộ cột cờ siêu dữ liệu vào cơ sở dữ liệu. Điều này cho phép chúng tôi làm 3 việc.

  1. Cờ tự cho phép SyncAdapter xác định các hàng cần thay đổi và những thay đổi đó là gì. Làm cách nào để bạn biết sự khác biệt giữa hàng được tạo cục bộ và hàng được sửa đổi cục bộ? Hơn nữa làm thế nào để bạn biết được gọi API REST nào? Nếu bạn chỉ cần xóa một hàng, làm thế nào để SyncAdapter của bạn biết hàng sẽ bị xóa nếu dữ liệu hiện đã biến mất? Thay vào đó, hãy đặt cờ "Nên xóa", và sau đó, khi chạy SyncAdapter, nó biết để đẩy một xóa vào máy chủ.

  2. Cờ phép CursorAdapter của bạn để thay đổi quan điểm cho rằng được tạo ra (như thêm một Spinner để chứng minh rằng "hàng này đã được đồng bộ hóa")

  3. Cuối cùng, và họ này không điểm ra , các cờ cho phép bạn biết lý do hàng bị sửa đổi. Nếu không có cờ nào được đặt và hàng thay đổi, nó phải là do bản cập nhật từ máy chủ. Vì vậy, không cần phải đồng bộ với mạng.

Vì vậy, hai quy trình công việc như sau:

thay đổi địa phương

  1. App tạo ra hàng mới. Hàng "tạo" cờ là đúng sự thật.
  2. Trình lưu trữ nội dung lưu trữ hàng, xem tạo cờ và do đó, gọi số này là notifyChange(...,true);
  3. Đồng bộ hóa với mạng = true (thông số cuối cùng) làm cho SyncAdapter kích hoạt.
  4. SyncAdapter quét cơ sở dữ liệu, tìm hàng có tạo cờ đặt và thực hiện hành động máy chủ phù hợp. Sau khi thành công, SyncAdapter xóa cờ.(cập nhật hàng ngày ContentProvivder)
  5. ContentProvider thấy cờ rõ ràng, không có cờ nào được đặt bên trái, vì vậy nó gọi notifyChange (..., false);
  6. ContentObserver s thấy sự thay đổi cờ, cập nhật để trông giống như "đồng bộ xong"

Tất cả các bước tương đương để cập nhật/xóa - một lá cờ cho mỗi hàng syncable cho mỗi tạo/cập nhật/xóa. Cũng nhận thấy chiến thắng còn lại - nếu "Tạo" tạm thời bị lỗi? máy chủ xuống ... Làm thế nào để bạn biết thử lại? - Đơn giản, bạn không xóa cờ "Tạo" và bạn sẽ thấy nó sau 15 phút.

từ xa Thay đổi

  1. SyncAdapter cháy do đồng bộ định kỳ.
  2. SyncAdapter tìm nạp bản cập nhật từ máy chủ. Đẩy các thay đổi vào cơ sở dữ liệu. Không đặt bất kỳ cờ nào. ContentProvider thấy thiếu cờ, biết thay đổi phải đến từ máy chủ (hoặc không phải là thay đổi cơ sở dữ liệu cần được đẩy tới máy chủ), do đó, nó gọi số notifyChange(...,false);
  3. ContentObserver s xem thay đổi nội dung và cập nhật với dữ liệu hàng mới
+0

Câu trả lời hay! Tất cả mọi thứ của cristal rõ ràng bây giờ, cảm ơn bạn! – m1h4

+2

+1 Có nhiều nhận xét về cuộc trò chuyện Google I/O, nhưng không nhiều người có xu hướng sử dụng Tùy chọn C. Cảm ơn bạn đã tóm tắt rõ ràng. –

+1

Đặt syncToNetwork tùy thuộc vào cờ là liên kết bị thiếu cho tôi. Giải pháp tuyệt vời! –

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