Tôi đã nghiên cứu một phương pháp để đồng bộ dữ liệu lõi được lưu trữ trong ứng dụng iPhone giữa nhiều thiết bị, chẳng hạn như iPad hoặc Mac. Không có nhiều khung đồng bộ hóa (nếu có) để sử dụng với Core Data trên iOS. Tuy nhiên, tôi đã suy nghĩ về khái niệm sau:
- Một thay đổi được thực hiện cho kho dữ liệu lõi cục bộ và thay đổi được lưu. (a) Nếu thiết bị đang trực tuyến, nó sẽ cố gắng gửi bộ thay đổi đến máy chủ, bao gồm cả ID thiết bị của thiết bị đã gửi bộ thay đổi. (b) Nếu bộ thay đổi không đến được máy chủ hoặc nếu thiết bị không trực tuyến, ứng dụng sẽ thêm thay đổi được đặt vào hàng đợi để gửi khi nó trực tuyến.
- Máy chủ, ngồi trên đám mây, hợp nhất các bộ thay đổi cụ thể mà nó nhận được với cơ sở dữ liệu chủ của nó.
- Sau khi bộ thay đổi (hoặc hàng đợi của bộ thay đổi) được hợp nhất trên máy chủ đám mây, máy chủ sẽ đẩy tất cả các bộ thay đổi đó sang các thiết bị khác đã đăng ký với máy chủ bằng cách sử dụng một số hệ thống bỏ phiếu. (Tôi nghĩ sẽ sử dụng các dịch vụ Đẩy của Apple, nhưng rõ ràng theo các nhận xét thì đây không phải là một hệ thống khả thi.)
Có bất cứ điều gì lạ mắt mà tôi cần phải suy nghĩ? Tôi đã xem xét các khung công tác REST như ObjectiveResource , Core Resource và RestfulCoreData . Tất nhiên, tất cả đều hoạt động với Ruby on Rails, thứ mà tôi không bị ràng buộc, nhưng đó là nơi để bắt đầu. Các yêu cầu chính tôi có cho giải pháp của mình là:
- Mọi thay đổi sẽ được gửi trong nền mà không tạm dừng luồng chính.
- Nó nên sử dụng càng ít băng thông càng tốt.
Tôi đã nghĩ về một số thách thức:
- Đảm bảo rằng ID đối tượng cho các kho dữ liệu khác nhau trên các thiết bị khác nhau được đính kèm trên máy chủ. Điều đó có nghĩa là, tôi sẽ có một bảng ID đối tượng và ID thiết bị, được gắn thông qua một tham chiếu đến đối tượng được lưu trữ trong cơ sở dữ liệu. Tôi sẽ có một bản ghi (DatabaseId [duy nhất cho bảng này], ObjectId [duy nhất cho mục trong toàn bộ cơ sở dữ liệu], Datafield1, Datafield2), trường ObjectId sẽ tham chiếu một bảng khác, AllObjects: (ObjectId, DeviceId, DeviceObjectId). Sau đó, khi thiết bị đẩy lên một bộ thay đổi, nó sẽ chuyển dọc theo Id thiết bị và objectId từ đối tượng dữ liệu cốt lõi trong kho lưu trữ dữ liệu cục bộ. Sau đó, máy chủ đám mây của tôi sẽ kiểm tra đối tượng Id đối tượng và thiết bị trong bảng AllObjects và tìm bản ghi để thay đổi trong bảng ban đầu.
- Tất cả các thay đổi nên được đánh dấu thời gian, để chúng có thể được hợp nhất.
- Thiết bị sẽ phải thăm dò máy chủ, mà không sử dụng quá nhiều pin.
- Các thiết bị cục bộ cũng sẽ cần cập nhật mọi thứ được giữ trong bộ nhớ nếu / khi nhận được thay đổi từ máy chủ.
Có điều gì khác tôi đang thiếu ở đây? Những loại khung nào tôi nên xem xét để thực hiện điều này có thể?