2011-11-15 54 views
18

Tôi lưu trữ một số dữ liệu trong ứng dụng iOS của tôi trực tiếp trong tệp .sqlite cục bộ. Tôi đã chọn để làm điều này thay vì CoreData vì dữ liệu sẽ cần phải tương thích với các nền tảng không phải của Apple.Đồng bộ hóa tệp sqlite cục bộ với iCloud

Bây giờ, tôi đang cố gắng tìm ra cách tốt nhất để đồng bộ hóa tệp này qua iCloud. Tôi biết bạn không thể đồng bộ hóa trực tiếp, vì nhiều lý do. Tôi biết CoreData có thể đồng bộ các DB của nó, nhưng thậm chí bỏ qua việc sử dụng CD về cơ bản sẽ khóa tập tin này vào các nền tảng của Apple (tôi nghĩ? Tôi chỉ nhìn vào đĩa CD một chút), tôi cần đồng bộ iCloud của tập tin này để làm việc TẤT CẢ các nền tảng được hỗ trợ của iCloud - được cho là bao gồm Windows. Tôi phải giả định rằng sẽ không có bất kỳ khả năng tương thích nào đối với các tệp CoreData trong API Windows. Lập kế hoạch ra cách tốt nhất để thực hiện điều này sẽ dễ dàng hơn nhiều nếu Apple sẽ cho chúng tôi biết nhiều hơn "Sẽ có một API Windows [cuối cùng?]"

Ngoài ra, cuối cùng tôi sẽ cần triển khai ít nhất một dịch vụ đồng bộ hóa nhiều hơn để hỗ trợ các nền tảng mà iCloud không hỗ trợ. Nó sẽ là hữu ích, mặc dù không cần thiết, nếu phương pháp tôi sử dụng cho iCloud có thể được chủ yếu sử dụng lại cho các dịch vụ trong tương lai.

Vì những lý do này, tôi không nghĩ rằng CoreData có thể giúp tôi với điều này. Tôi có đúng trong suy nghĩ này không?

Chuyển từ đó, tôi cần đưa ra thuật toán cho điều này hoặc tìm giải thuật hiện tại hoặc tìm giải pháp hiện có của bên thứ ba. Tôi chưa gặp bất cứ điều gì. Tuy nhiên, tôi đã nghiền ngẫm một vài phương pháp có thể, tôi có thể thực hiện:

Phương pháp 1:

Do something tương tự như cách CoreData đồng bộ DBS sqlite: gửi "nhật ký giao dịch" để iCloud thay vào đó và xây dựng mỗi file sqlite địa phương tắt của những người.

Tôi nghĩ mỗi thiết bị sẽ gửi tệp văn bản (được đặt tên duy nhất) liệt kê tất cả các lệnh sql mà thiết bị đó đã thực thi, với dấu thời gian. Thiết bị sẽ lưu trữ cách xa trong mỗi danh sách các lệnh mà nó đã thực hiện và tiếp tục từ điểm đó mỗi khi tệp được cập nhật. Nếu nó nhận được cập nhật cho nhiều tệp nhật ký cùng một lúc, nó sẽ thực thi mỗi lệnh theo thứ tự dấu thời gian.

Mọi thứ có thể trở nên “thú vị” một cách hiệu quả khi các tệp này lớn, nhưng có vẻ như là một vấn đề có thể giải quyết được.

Cách 2:

kỳ đồng bộ hóa một bản sao của cơ sở dữ liệu và làm việc tại iCloud. Có một trường dấu thời gian sửa đổi trong mỗi bản ghi. Khi một bản sao cập nhật của DB đi qua, truy vấn tất cả các bản ghi với các dấu thời gian mới hơn so với một số thời gian tham chiếu và cập nhật bản ghi trong DB cục bộ từ dữ liệu mới.

Tôi thấy nhiều vấn đề tiềm năng với phương pháp này:

-Hiện để thực hiện một cái gì đó hơn nữa để nhận xóa kỷ lục.

-Các tệp DB có thể bị xung đột. Có thể xử lý chúng bằng cách xử lý từng phiên bản xung đột theo thứ tự dấu thời gian.

-Xác định ngày để kiểm tra từng cập nhật từ có thể phức tạp, vì tùy thuộc vào thiết bị cập nhật.

Có rất nhiều vấn đề tiềm năng với phương pháp 2, nhưng phương pháp 1 có vẻ như có thể thực hiện được với tôi ...

Có ai có bất kỳ đề xuất nào về những gì có thể là hành động tốt nhất? Bất kỳ ý tưởng tốt hơn so với "Phương pháp 1" của tôi (hoặc lý do tại sao nó sẽ không hoạt động)?

Trả lời

3

Hãy thử những hai giải pháp từ Ray Wenderlich:

Xuất/Nhập dữ liệu qua mail: http://www.raywenderlich.com/1980/how-to-import-and-export-app-data-via-email-in-your-ios-app

File Sharing với iTunes: http://www.raywenderlich.com/1948/how-integrate-itunes-file-sharing-with-your-ios-app

tôi thấy nó khá phức tạp nhưng đã giúp tôi rất nhiều .

+2

Đây là cách đơn giản để chuyển các tệp (mà iCloud cũng làm). Vấn đề tôi có là để phản ánh những thay đổi đối với một tệp cơ sở dữ liệu tồn tại trên nhiều thiết bị. Tôi không thể chỉ sao chép một bản sao sang các thiết bị khác vì phiên bản trên mỗi thiết bị có thể có các thay đổi duy nhất. Dù sao, tôi đã kết thúc việc thực hiện "Phương pháp 1" và nó đang hoạt động cho đến nay ... – JDR

1

Cả phương pháp 1 và phương pháp 2 đều có thể thực hiện được. Có lẽ một sự kết hợp của hai trong thực tế - sử dụng iCloud để gửi một tập tin cơ sở dữ liệu riêng biệt đó là một tập hợp con của dữ liệu - tức là chỉ cần thay đổi các mục. Hoặc có thể định dạng tệp khác thay vì sqlite db - XML ​​/ JSON/CSV, v.v.

Một cách khác là thực hiện nó ngoài iCloud - nghĩa là dịch vụ web tùy chỉnh đơn giản để đồng bộ hóa. Vì vậy, mỗi thay đổi được gửi đến một máy chủ trung tâm thông qua JSON/XML qua HTTP, và sau đó các thiết bị khác kéo cập nhật từ đó. Rõ ràng là nó phụ thuộc vào số lượng dữ liệu và số lượng thiết bị bạn muốn đồng bộ hóa và liệu bạn có quyền truy cập vào một máy chủ và/hoặc ngân sách thích hợp để trang trải một máy chủ như vậy hay không. iCloud sẽ làm điều đó cho "miễn phí" nhưng tất cả nó thực sự là chuyển các tập tin. Một giải pháp tùy chỉnh cho phép bạn xác định mô hình đồng bộ hóa của mình theo ý muốn, nhưng bạn phải phát triển và quản lý nó và trả tiền cho nó.

0

Tôi đã xem xét khả năng chuyển tệp cơ sở dữ liệu qua iCloud nhưng tôi nghĩ rằng tôi sẽ gặp phải các vấn đề về thời gian - khởi động chậm cho người dùng - và cơ sở dữ liệu bị hỏng nếu ứng dụng chạy trên nhiều thiết bị cùng một lúc. (iPad/iPhone chẳng hạn).

Sooo. Tôi đã phải sử dụng phương thức nhật ký giao dịch. Nó thực sự là khó khăn để thực hiện, nhưng một lần tại chỗ, có vẻ ok.

Tôi đang sử dụng mẫu SharedCoreData của Apple làm cơ sở cho tác phẩm này. Liên kết này yêu cầu Tài khoản nhà phát triển Apple.

Tôi đã tìm được giải pháp tốt hơn nhiều từ Tim Roadley tuy nhiên điều này chỉ hoạt động đối với IOS và tôi cần cả iOS và MacOS.

rant> Phát triển iCloud thực sự phải dễ dàng hơn và ổn định hơn!/rant

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