Cách tốt nhất để đồng bộ hóa HTML5 DB cục bộ (Lưu trữ WebQuery, SQLite) với máy chủ (đồng bộ hóa 2 chiều) [đã đóng]


151

Tôi đang phát triển một ứng dụng web di động (dành cho iPhone và Android) với cơ sở dữ liệu cục bộ (sử dụng lưu trữ web html5) để ứng dụng của tôi vẫn có thể sử dụng được khi người dùng ngoại tuyến.

Điều này đang hoạt động hoàn hảo, nhưng tôi muốn lưu dữ liệu cục bộ trên một máy chủ. Vì vậy, tôi cần phải đồng bộ hóa DB cục bộ với DB trên máy chủ. Đồng bộ hóa chỉ có thể là một cách, nhưng trong tương lai, tôi muốn đồng bộ hóa nó theo cả hai cách (máy chủ <-> DB cục bộ).

Yêu cầu này có vẻ rất phổ biến (hoặc sẽ phổ biến trong tương lai cho ứng dụng web trên thiết bị di động), nhưng tôi không thể tìm thấy một thư viện làm điều đó.

Tôi biết google đang làm điều đó trong ứng dụng web di động của họ (ví dụ: gmail) và tôi đã tìm thấy dự án WSPL một dự án google nhưng không có nguồn để tải xuống.

Nếu tôi không thể tìm ra giải pháp, tôi sẽ tạo một thư viện để thực hiện điều đó, vì một cách đồng bộ hóa không có vẻ khó khăn, nhưng tôi tự hỏi liệu có giải pháp nào khác không.


2
Tôi không biết có bất kỳ lib nào không, nhưng cách dễ nhất để làm điều này dường như là lưu trữ dấu thời gian sửa đổi và chuyển các thay đổi sang các bản ghi mới hơn các bản ghi ở phía bên kia, đồng thời chuyển các bổ sung và xóa kể từ lần đồng bộ hóa cuối cùng. Nó có thể phát điên nếu đồng hồ cục bộ và máy chủ không đồng bộ, nhưng bạn sẽ nghĩ về điều gì đó. - Đăng bài dưới dạng bình luận vì có lẽ nó không hữu ích lắm và không cung cấp cho bạn câu trả lời.
Ivan Vučica

Cảm ơn Ivan. Bạn đã đúng, nếu đồng hồ cục bộ và máy chủ không đồng bộ, nó có thể lộn xộn ... Tôi chỉ thấy rằng: quickconnect.pbworks.com/Using- Entryprise-Syn syncization Nó nói rằng nó có thể đồng bộ hóa HTML 5 DB cục bộ với một DB trong một máy chủ. Tôi cần có cái nhìn sâu hơn về điều đó và xem liệu nó có thể chạy bên ngoài Khung kết nối QuickConnect không ...
Samuel

Tôi đã tìm thấy một giải pháp khác: impel.simulacre.org/blog/ Từ Trông thật tuyệt, nhưng bạn sẽ cần sử dụng thư viện Mootools và Impel ORM ...
Samuel

1
CouchDB thì sao? couchdb.apache.org
julianm

4
Các chủ đề dành cho các cuộc thảo luận , Stack Exchange là dành cho các câu hỏi . Tại một thời điểm bài viết như thế này đã được chấp nhận trên Stack Exchange, nhưng không còn nữa.
casperOne

Câu trả lời:


70
  • Tôi đã tạo một lib lib nhỏ có tên WebSqlSync để đồng bộ hóa DB WebSql cục bộ với máy chủ (máy khách <-> máy chủ). Rất dễ sử dụng và tích hợp trong mã của bạn:

https://github.com/orbitaloop/WebSqlSync

  • Dự án nguồn mở QuickConnect chứa thư viện JS để đồng bộ hóa DB SQLite cục bộ với DB máy chủ (MySQL hoặc loại khác):

http://quickconnect.pbworks.com/Using- Entryprise -Snyncization

Để sử dụng lib này, bạn cần sử dụng DataAccessObject của khung để truy cập DB của bạn. Nó hoạt động bằng cách lưu trữ tất cả các yêu cầu SQL được áp dụng cho DB (ngoại trừ chọn tất nhiên) và gửi chúng đến máy chủ. Thật tuyệt khi quản lý xóa, nhưng sẽ hơi nặng nếu bạn có nhiều cập nhật và máy chủ cần sử dụng cùng ngôn ngữ SQL ...

  • Một dự án khác từ QuickConnect là một đồng bộ SQLite riêng (trong Objective C cho iOS hoặc Mac OS và trong Java cho Android):

http: //www.quickconnectf Family.org/qcdbsync/ (Tôi nghĩ rằng nó cũng lưu trữ lịch sử của tất cả các yêu cầu SQL)

  • Và tôi vừa tìm thấy một thư viện JS đầy triển vọng khác: kiên trìJS

https://github.com/zefhemel/persistencejs

"continence.js là một thư viện ánh xạ quan hệ đối tượng Javascript không đồng bộ. Bạn có thể sử dụng nó trong trình duyệt, cũng như trên máy chủ (và bạn có thể chia sẻ các mô hình dữ liệu giữa chúng)."

Họ có một mô-đun đồng bộ DB: DOC của kiên trì.synch.js

(hoạt động với HTML5 DB SQLite hoặc Google Gears trên máy khách và MySQL trên máy chủ)

  • Và cũng có Impel.inTouch . Nó trông rất dễ sử dụng (bao gồm các tệp php), nhưng bạn phải sử dụng khung Mootools ở phía máy khách:

http://impel.simulacre.org/api/Impel.inTouch

  • Sencha cũng có một dịch vụ đồng bộ hóa: Sencha.io . Trông thật tuyệt, nhưng nó phụ thuộc vào khung Sencha Touch:

http://www.sencha.com/products/io/


Xin chào Samuel, js lib có phù hợp với bạn không?
Mathias Conradt

Đồng bộ hóa DB không phải là ưu tiên của tôi bây giờ, vì vậy tôi chỉ bỏ cuộc, chờ đợi một giải pháp mạnh mẽ và chuẩn hơn ...
Samuel

3
Sau khi thử nghiệm tất cả chúng, tôi nghĩ rằng tôi sẽ phát triển lib lib nhỏ của riêng mình để đồng bộ hóa WebQuery với máy chủ DB. Nó sẽ là một đồng bộ kép (máy chủ <-> cục bộ) và sẽ không có bất kỳ sự phụ thuộc nào. Tôi sẽ đăng ở đây liên kết đến mã sau khi hoàn thành
Samuel

2
Tôi đã cam kết phiên bản đầu tiên của giải pháp đồng bộ hóa của riêng mình có tên WebSqlSync: github.com/orbitaloop/WebSqlSync (cf dưới đây trả lời)
Samuel

1
Xin chào các bạn, tôi đã bắt đầu một plugin kiên trì để đồng bộ hóa yên tĩnh. Nó vẫn còn trong phát triển, nhưng nếu có ai muốn check it out: github.com/robertokl/persistencejs và một ví dụ làm việc trên phía máy chủ / khách hàng với Ruby on Rails: github.com/robertokl/persistencejs-restfulSync-example
robertokl

18

Tôi đã phát triển một giải pháp đồng bộ hóa chung gọi là WebSqlSync .

Nó không phụ thuộc vào bất kỳ khuôn khổ nào. Nó có sẵn ở đây: https://github.com/orbitaloop/WebSqlSync

Trích xuất tệp README:

WebSqlSync

Tự động đồng bộ hóa cơ sở dữ liệu WebSql cục bộ (SQLite trong bộ điều hướng) với máy chủ. (Đồng bộ hóa 2 chiều: máy khách <-> máy chủ)

Rất dễ tích hợp với ứng dụng hiện tại của bạn và rất dễ sử dụng (2 chức năng để gọi: initSync và syncNow)

Sử dụng

Khởi tạo

Bạn cần khởi tạo lib (ví dụ tại mỗi lần khởi động).

Nó sẽ tự động tạo 2 bảng (nếu chúng chưa tồn tại, một để lưu trữ tất cả các phần tử mới hoặc đã sửa đổi (bảng new_elem) và một để lưu trữ ngày đồng bộ hóa cuối cùng (bảng sync_info). Nó cũng sẽ tạo các trình kích hoạt SQLite trong để xem CHERTN hoặc CẬP NHẬT trên các bảng bạn muốn đồng bộ hóa (để tự động chèn các phần tử đã sửa đổi vào bảng new_elem):

DBSYNC.initSync(TABLES_TO_SYNC, webSqlDb, sync_info, 'http://www.myserver.com', callBackEndInit);

Trong đó TABLES_TO_SYNC là danh sách bảng mà bạn muốn đồng bộ hóa với máy chủ, ví dụ:

TABLES_TO_SYNC = [
    {tableName : 'table1', idName : 'the_id'},
    {tableName : 'table2'} //if idName not specified, it will assume that it's "id"
];

Làm cho đồng bộ

Để bắt đầu đồng bộ hóa, bạn cần gọi hàm syncNow. Bạn có thể gọi nó sau mỗi X giây hoặc sau một số thay đổi chẳng hạn:

DBSYNC.syncNow(callBackSyncProgress, function(result) {
     if (result.syncOK === true) {
         //Synchronized successfully
     }
});

Và đó là tất cả những gì bạn cần làm trên máy khách. Về phía máy chủ, bạn sẽ cần mã hóa giải pháp của riêng bạn (nhưng nó không phức tạp). Và có một số ví dụ trongPHP & Java. Một lần nữa, đóng góp được chào đón.


Làm thế nào tốt bạn sẽ nói điều này đã làm việc cho bạn, tóm tắt nó một năm sau? Tôi đang tìm kiếm một DB phía máy khách tốt, hoạt động cho các trình duyệt và thiết bị di động.
Niklas

1
WebQuerySync đang hoạt động rất tốt với hơn 25 ứng dụng được sản xuất (iOS và Android). WebQuery thực sự tuyệt vời và nhanh chóng. Nó hoạt động trên iOS, Android, Blackberry (phiên bản mới nhất tôi nghĩ) và tất nhiên là chrome và safari. Nhưng nó không hoạt động trên IE và firefox, vì API đã bị W3C không dùng nữa ..
Samuel

Được rồi, cả tích cực và tiêu cực ở đó. Cảm ơn các tóm tắt!
Niklas

2
Bạn có bất cứ điều gì tương tự nhưng đối với localStorage và không phải WebQuery không?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.