2012-02-05 33 views
12

Tôi có ứng dụng iPhone (iOS) giữ dữ liệu trong cơ sở dữ liệu SQLite cục bộ trên mỗi thiết bị. Các ứng dụng được sử dụng để quản lý một tài khoản ngân hàng ảo cho trẻ em để theo dõi trợ cấp của họ, chi tiêu, tiết kiệm, vv (KidsBank và KidsBank miễn phí). Tôi nhận được rất nhiều yêu cầu từ cha mẹ để cung cấp khả năng đồng bộ hóa giữa cha mẹ và thậm chí có thể là thiết bị iOS dành cho trẻ em của họ.Ứng dụng iPhone (iOS) sử dụng sqlite cục bộ và muốn đồng bộ giữa nhiều thiết bị

Tôi đã xem xét một số tùy chọn, nhưng tất cả đều tẻ nhạt và không tầm thường vì điều này về cơ bản đòi hỏi phải nhân rộng cơ sở dữ liệu hoặc kiến ​​trúc mới. Bất kỳ giao dịch nào trên bất kỳ thiết bị nào cũng lý tưởng sẽ xuất hiện (đồng bộ) với tất cả các thiết bị trong gia đình (càng sớm càng tốt).

Lý tưởng nhất, tôi muốn đồng bộ hóa sẽ được tự động & tay tắt

tùy chọn bao gồm (1) Sử dụng iCloud (2) Sử dụng kết nối mạng trực tiếp giữa các thiết bị (wifi) (3) Sử dụng một cơ sở dữ liệu phía máy chủ và web dịch vụ (JSON/RESTful)

(1) iCloud PRO: iCloud cung cấp phân phối tập tin đồng bộ hóa CON: iOS 5 yêu cầu, các file cơ sở dữ liệu SQLite không thể được đồng bộ hóa thông qua iCloud, sao chép cơ sở dữ liệu cổ điển (và không tầm thường)

Sử dụng iCloud là một sự cân nhắc mạnh mẽ. Các thiết bị có thể ghi nhật ký giao dịch tùy chỉnh vào một tệp iCloud trong đó có một tệp cho mỗi thiết bị được xác định bằng một ID thiết bị duy nhất. Id duy nhất toàn cầu (GID) và dấu thời gian thay đổi cuối cùng được thêm vào mỗi bảng. Tất cả các thiết bị tham gia sẽ viết một ID thiết bị duy nhất cho một tệp riêng biệt trong iCloud. Khi khởi chạy ứng dụng hoặc khi thay đổi tệp nhật ký, ứng dụng chạy trên một thiết bị cụ thể sẽ tải tất cả các giao dịch nhưng không phải tất cả các giao dịch được tạo trên thiết bị của riêng chúng từ các tệp qua iCloud. Thiết bị tham gia cuối cùng để tải giao dịch sẽ xóa giao dịch khỏi tệp. Nếu thiết bị không phải là thiết bị tham gia cuối cùng, nó chỉ đơn giản là ký tắt trên giao dịch và cho phép tệp đồng bộ hóa qua iCloud. Có thể có các thuật toán tốt hơn, nhưng ý tưởng cơ bản là giống nhau - sử dụng iCloud để đẩy xung quanh nhật ký thay đổi.

(2) Kết nối wifi trực tiếp sẽ cho phép hai thiết bị được tích hợp theo cách thủ công. PRO: Không phức tạp để quản lý quá trình đồng bộ hóa CON: Người dùng phải chọn đồng bộ hóa từ ứng dụng của họ khi kết nối trên wifi

(3) Di chuyển toàn bộ cơ sở dữ liệu hoặc quản lý giao dịch trên máy chủ. PRO: Đồng bộ hóa không còn cần thiết CON: Vấn đề điển hình cho ứng dụng hướng web. Cần phải viết lại lớp dịch vụ cơ sở dữ liệu (hiện tại trong SQL) để sử dụng dịch vụ web từ xa. Chi phí chạy một máy chủ (tôi sẽ sử dụng AWS).

Có ai có thể cung cấp một số kinh nghiệm trong việc đồng bộ hóa SQLite giữa nhiều thiết bị không? Tôi đang nghiêng về hướng sử dụng iCloud để đẩy các bản ghi giao dịch. Tôi đang cố gắng giảm thiểu chi phí và sự phức tạp.

+0

Câu hỏi hay ... +1 –

+0

iCloud có yêu cầu tất cả các thiết bị phải nằm trên cùng một ID Apple không? Điều đó sẽ không hiệu quả trong gia đình tôi. –

Trả lời

3

Di chuyển sang iCloud có lẽ là giải pháp tốt nhất, vì nó đã được Apple chứng minh và thực hiện. Bạn không cần phải lo lắng nhiều về yêu cầu iOS 5, như theo hầu hết các số liệu thống kê trên 90% sử dụng nó. iOS 5 là miễn phí để nâng cấp lên. Sau đó, bạn có thể đổi tên phiên bản cũ của mình thành Lite và tiếp tục mà không cần đồng bộ hóa.

Đồng bộ hóa có lẽ là một trong những điều khó khăn nhất bạn thực hiện.

Một giải pháp mà tôi thực hiện là tất cả thay đổi đối với cơ sở dữ liệu để lại nhật ký, với dấu thời gian, uniqueid và vài thứ khác để đảm bảo giao dịch hoàn toàn ẩn danh và hoàn toàn độc đáo.Tôi đã tạo một dịch vụ web cực kỳ đơn giản có hai thao tác, bạn có thể thêm giao dịch vào nó, vì vậy tôi đồng bộ hóa bất cứ khi nào người dùng sử dụng wifi, vì vậy tôi đẩy tất cả thay đổi, nhận kết quả từ máy chủ, sau đó xóa bản ghi giao dịch được đồng bộ hóa.

Tác vụ khác là tìm nạp bản ghi, gửi dấu thời gian của lần đồng bộ hóa cuối cùng, userid và khác.

Tất cả dữ liệu được gửi bằng JSON và nhận được như vậy. Nó có thể dễ dàng xử lý hàng chục ngàn người dùng, chạy trên một máy chủ Amazon EC2 nhỏ.

Điều này là khá nhiều cách iCloud hoạt động, nhưng tôi đã thực hiện giải pháp này trước iCloud. Bây giờ tôi sẽ iCloud, nhưng có lẽ cần phải giữ cho máy chủ chạy thêm 1 năm nữa, tùy thuộc vào cách sử dụng.

Hy vọng điều này sẽ giúp bạn.

+0

Có thể thay thế "máy chủ EC2 nhỏ" bằng phiên bản doku của Heroku nhẹ, miễn phí. Phụ thuộc vào yêu cầu lưu trữ thực tế. – Romain

+0

Tất nhiên, bất cứ nơi nào bạn có thể đặt một dịch vụ web đơn giản trên. ALl bạn cần là để chạy dịch vụ và cơ sở dữ liệu –

+0

Thật vậy. Tôi chủ yếu dự định đây là một lưu ý cho người đọc - nếu nhu cầu lưu trữ thực tế là ~ 0, thì Heroku sẽ rẻ hơn (miễn phí). – Romain

2

Sau khi tìm thời gian để quay lại làm việc trên ứng dụng và cũng với thời gian trôi qua và sao chép dữ liệu Core iCloud trưởng thành, tôi đã chuyển ứng dụng của mình thành Dữ liệu cốt lõi (NSSQLiteStoreType) và theo dõi thông báo như persistentStoreDidImportUbiquitousContentChanges. Sử dụng di chuyển nhẹ quá. Làm việc tốt.

+0

Xin chào Bill, tại sao bạn không sử dụng iCloud để đồng bộ hóa tệp SQLite? Đã có một hạn chế? Ngoài ra, mất bao lâu để chuyển đổi ứng dụng của bạn thành Dữ liệu cốt lõi? – pAkY88

+0

Tôi đã có một lớp trừu tượng dữ liệu để chuyển đổi chỉ liên quan đến việc viết lại lớp dữ liệu cho hầu hết các phần. Không thể đơn giản di chuyển tệp SQLLite sang iCloud vì sẽ có các vấn đề về cơ sở dữ liệu đồng thời. Tôi đã chuyển đổi thành Core Data thành công trong khoảng 30 ngày bắt đầu phát hành (bán thời gian, chỉ cho tôi). Thời gian sẽ phụ thuộc vào kích thước của dữ liệu và độ phức tạp của ứng dụng. Tôi đã nhận được một chút của một vấn đề với Core Data/iCloud, nơi một số người dùng đã bị mất dữ liệu của họ, đó là ngoài tầm kiểm soát của tôi. Tôi không thể sử dụng Dữ liệu cốt lõi qua iCloud trong tương lai. –

+0

Cảm ơn thông tin! Bởi "cơ sở dữ liệu vấn đề đồng thời" bạn có nghĩa là thực tế là có thể có sửa đổi trên cơ sở dữ liệu cùng một lúc? Nếu vậy, nếu iCloud được sử dụng để đồng bộ hóa một tệp trên nhiều thiết bị thuộc cùng một người dùng, tôi thực sự không nghĩ đó là vấn đề. – pAkY88

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