Đồng bộ hóa dữ liệu giữa Ứng dụng Android và máy chủ web [đã đóng]


262

Tôi muốn đồng bộ hóa dữ liệu (như bản ghi db, phương tiện) giữa Ứng dụng Android và Máy chủ. Nếu bạn đã xem Evernotehoặc các ứng dụng tương tự, bạn chắc chắn hiểu ý tôi là gì.

Tôi có một số câu hỏi (hãy tưởng tượng chúng tôi muốn đồng bộ hóa các bản ghi DB):

  1. Mỗi người dùng có một phần không gian máy chủ cho mình (chẳng hạn như Evernotehoặc Dropbox). Có thể người dùng tạo bản ghi mới bằng điện thoại di động và tạo bản ghi mới trong máy chủ. Làm thế nào tôi có thể kết hợp các hồ sơ này với nhau? Nếu có hồ sơ có cùng ID, bạn gợi ý cho tôi thuật toán nào?

  2. Ngoại trừ JSON , có cách nào để gửi dữ liệu giữa thiết bị điện thoại di động và máy chủ không?

  3. Nếu SyncAd CHƯƠNGContentProvider có thể giải quyết vấn đề của tôi, vui lòng giải thích chính xác cho tôi. (Nếu bạn có thể cung cấp một số mẫu hoặc hướng dẫn cho tôi HOẶC Mọi lời khuyên hoặc từ khóa để giúp mở rộng / hướng dẫn tìm kiếm của tôi cũng sẽ được đánh giá cao).


1
Trước tiên, bạn cần tìm ra (quyết định) giao thức liên lạc của bạn với máy chủ - do đó - bạn có thể chuyển dữ liệu nào và làm thế nào.
hovanessyan

Đó là điều quan trọng đối với tôi, chuyển dữ liệu SQLlite. nhưng tôi sẽ biết làm thế nào để chuyển dữ liệu khác. Tôi không hiểu ý của bạn về giao thức. xin giải thích thêm.
Omid Nazifi

Bởi giao thức Ý tôi là này simple.wikipedia.org/wiki/Internet_Protocol
hovanessyan

1
hãy thử konysync, một sản phẩm của konylabs cung cấp các giải pháp đầu cuối trên nhiều nền tảng khác nhau (android, windows, ios), máy chủ web, nhà cung cấp dữ liệu (nhân viên bán hàng, nhà cung cấp sap), cơ sở dữ liệu (sqlserver, mysql ...)
vào

Câu trả lời:


311

Tôi sẽ cố gắng trả lời tất cả các câu hỏi của bạn bằng cách giải quyết câu hỏi lớn hơn: Làm cách nào tôi có thể đồng bộ hóa dữ liệu giữa máy chủ web và ứng dụng Android?


Đồng bộ hóa dữ liệu giữa máy chủ web của bạn và ứng dụng Android yêu cầu một vài thành phần khác nhau trên thiết bị Android của bạn.

Lưu trữ liên tục:

Đây là cách điện thoại của bạn thực sự lưu trữ dữ liệu mà nó nhận được từ máy chủ web. Một phương pháp khả thi để thực hiện điều này là viết ContentProvider tùy chỉnh của riêng bạn được hỗ trợ bởi cơ sở dữ liệu Sqlite. Một hướng dẫn tốt cho một nhà cung cấp nội dung có thể được tìm thấy ở đây: http://thinkandroid.wordpress.com/2010/01/13/wr-your-own-contentprovider/

Một ContentProvider định nghĩa một giao diện phù hợp để tương tác với dữ liệu lưu trữ của bạn. Nó cũng có thể cho phép các ứng dụng khác tương tác với dữ liệu của bạn nếu bạn muốn. Đằng sau ContentProvider của bạn có thể là cơ sở dữ liệu Sqlite, Cache hoặc bất kỳ cơ chế lưu trữ tùy ý nào.

Mặc dù tôi chắc chắn sẽ khuyên bạn nên sử dụng ContentProvider với cơ sở dữ liệu Sqlite, bạn có thể sử dụng bất kỳ cơ chế lưu trữ dựa trên java nào bạn muốn.

Định dạng trao đổi dữ liệu:

Đây là định dạng bạn sử dụng để gửi dữ liệu giữa máy chủ web và ứng dụng Android của bạn. Hai định dạng phổ biến nhất hiện nay là XML và JSON. Khi chọn định dạng của bạn, bạn nên suy nghĩ về loại thư viện tuần tự hóa nào có sẵn. Tôi biết rằng có một thư viện tuyệt vời để tuần tự hóa json được gọi là gson: https://github.com/google/gson , mặc dù tôi chắc chắn các thư viện tương tự tồn tại cho XML.

Dịch vụ đồng bộ hóa

Bạn sẽ muốn một số loại tác vụ không đồng bộ có thể nhận dữ liệu mới từ máy chủ của bạn và làm mới nội dung di động để phản ánh nội dung của máy chủ. Bạn cũng sẽ muốn thông báo cho máy chủ bất cứ khi nào bạn thực hiện thay đổi cục bộ đối với nội dung và muốn phản ánh những thay đổi đó. Android cung cấp mẫu SyncAd CHƯƠNG như một cách để dễ dàng giải quyết mẫu này. Bạn sẽ cần phải đăng ký tài khoản người dùng và sau đó Android sẽ thực hiện nhiều phép thuật cho bạn và cho phép bạn tự động đồng bộ hóa. Đây là một hướng dẫn tốt: http://www.c99.org/2010/01/23/writer-an-android-sync-provider-part-1/


Về cách bạn xác định xem các bản ghi có giống nhau hay không, thông thường bạn sẽ tạo các mục với một id duy nhất mà bạn lưu trữ cả trên thiết bị Android và máy chủ. Bạn có thể sử dụng điều đó để đảm bảo rằng bạn đang tham khảo cùng một tài liệu tham khảo. Hơn nữa, bạn có thể lưu trữ các thuộc tính cột như "update_at" để đảm bảo rằng bạn luôn nhận được dữ liệu mới nhất hoặc bạn không vô tình ghi lên dữ liệu mới được ghi.


3
Còn lượng dữ liệu lớn thì sao? Làm thế nào tôi có thể đồng bộ hóa?
Pratik Butani

4
Giải thích rất rõ Tôi chỉ có một ghi chú ... SyncAd CHƯƠNG -> "thực hiện nhiều phép thuật". Tôi hy vọng bạn đang coi nó là ma thuật đen ... nó hoàn toàn xấu xa.
MRodrigues

@MRodrigues: SyncAd CHƯƠNG có thể là ma thuật đen cho nhà phát triển nhưng nó vẫn làm phép thuật cho sự ổn định và chức năng, nó tốt hơn nhiều so với các
lib

2
Bản thân dịch vụ web yêu cầu gì để đồng bộ hóa nó với thiết bị Android? Có thể với mùa xuân?
jublikon

58

Nếu chúng ta nghĩ về ngày hôm nay , câu trả lời được chấp nhận là quá cũ. Như chúng tôi biết rằng chúng tôi có nhiều thư viện mới có thể giúp bạn tạo các loại ứng dụng này.

Bạn nên tìm hiểu các chủ đề sau đây sẽ giúp bạn chắc chắn:

  • SyncAd CHƯƠNG: Thành phần bộ điều hợp đồng bộ hóa trong ứng dụng của bạn đóng gói mã cho các tác vụ truyền dữ liệu giữa thiết bị và máy chủ. Dựa trên lịch trình và trình kích hoạt bạn cung cấp trong ứng dụng của mình, khung bộ điều hợp đồng bộ hóa chạy mã trong thành phần bộ điều hợp đồng bộ hóa.

  • Realm : Realm là một cơ sở dữ liệu di động: thay thế cho SQLite & Core Data.

  • Trang bị thêm ứng dụng khách HTTP an toàn cho Android và Java của Square, Inc. Phải học cách sử dụng một cách thông minh

Và logic đồng bộ hóa của bạn cho cơ sở dữ liệu như: Làm cách nào để đồng bộ cơ sở dữ liệu SQLite trên điện thoại Android với cơ sở dữ liệu MySQL trên máy chủ?

May mắn nhất cho tất cả người học mới. :)


Liên kết đến một cách thông minh để sử dụng trang bị thêm đã chết
Greg Holst

@GregHolst cập nhật.
Pratik Butani

3
Vẫn xuống. Hoặc yêu cầu đăng nhập? Archive.org có nó: web.archive.org/web/20160316222227/https://futurestud.io/blog/...
bobpaul

24

Nếu bạn tự viết điều này thì đây là một số điểm cần lưu ý

Xác thực hợp lệ giữa thiết bị và Máy chủ đồng bộ

Một giao thức đồng bộ giữa thiết bị và máy chủ. Nó thường sẽ đi theo 3 giai đoạn, xác thực, trao đổi dữ liệu, trao đổi trạng thái (hoạt động nào hoạt động và thất bại)

Chọn định dạng tải trọng của bạn. Tôi đề nghị XML dựa trên SyncML trộn với định dạng dựa trên JSON để thể hiện dữ liệu thực tế. Vì vậy, SyncML cho giao thức và JSON cho dữ liệu thực tế được trao đổi. Sử dụng JSON Array trong khi thao tác dữ liệu luôn được ưu tiên vì dễ dàng truy cập dữ liệu bằng JSON Array.

Theo dõi các thay đổi dữ liệu trên cả máy khách và máy chủ. Bạn có thể duy trì thay đổi id thay đổi và chọn chúng trong phiên đồng bộ hóa. Ngoài ra, xóa thay đổi khi các đối tượng được đồng bộ hóa thành công. Bạn cũng có thể sử dụng biến boolean để xác nhận trạng thái đồng bộ hóa, tức là lần đồng bộ hóa cuối cùng. Nó sẽ hữu ích cho người dùng cuối để xác định thời gian khi quá trình đồng bộ hóa cuối cùng được thực hiện.

Cần có cách giao tiếp từ máy chủ đến thiết bị để bắt đầu phiên đồng bộ hóa khi dữ liệu thay đổi trên máy chủ. Bạn có thể sử dụng C2DM hoặc viết giao tiếp dựa trên tcp liên tục của riêng bạn. Cách tiếp cận tcp rất liền mạch

Cách sao chép dữ liệu thay đổi trên nhiều thiết bị

Và cuối cùng nhưng không kém phần quan trọng, một cách để phát hiện và xử lý xung đột

Hy vọng điều này sẽ giúp như một điểm khởi đầu tốt.


14

@Grantismo cung cấp một lời giải thích tuyệt vời về tổng thể. Nếu bạn muốn biết ai là người thực sự làm những việc này, tôi khuyên bạn nên xem google đã làm như thế nào cho Ứng dụng Google IO năm 2014 (luôn luôn xem xét sâu về mã nguồn của các ứng dụng mà họ phát hành. rất nhiều để học hỏi từ đó).

Đây là một bài đăng trên blog về nó: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

Về cơ bản, về phía ứng dụng: GCM để báo hiệu, Bộ điều hợp đồng bộ hóa để tìm nạp dữ liệu và nói chuyện đúng với Nhà cung cấp nội dung sẽ khiến mọi thứ liên tục (vâng, nó cách ly DB khỏi truy cập trực tiếp từ các phần khác của ứng dụng).

Ngoài ra, nếu bạn muốn xem mã của năm 2015: https://github.com/google/iosched


Mã nguồn cho ứng dụng Google IO khá hữu ích IMO!
Richeek

10

Ví dụ: bạn muốn đồng bộ hóa bảng todoTabletừ MySqlđếnSqlite

Đầu tiên, tạo một tên cột version (type INT)trong todoTablecho cả hai SqliteMySql nhập mô tả hình ảnh ở đây

Thứ hai, tạo một tên bảng database_versionvới một tên cộtcurrentVersion(INT)
nhập mô tả hình ảnh ở đây

Trong MySql, khi bạn thêm một mục mới vào todoTablehoặc cập nhật mục, bạn phải nâng cấp phiên bản của mục này thêm +1 và cũng nâng cấpcurrentVersion nhập mô tả hình ảnh ở đây

Trong Android, khi bạn muốn đồng bộ hóa (bằng cách nhấn nút đồng bộ hóa thủ công hoặc dịch vụ chạy với khoảng thời gian):

Bạn sẽ gửi yêu cầu với SqlitecurrentVersion (hiện tại là 1) đến máy chủ.
Sau đó, trong máy chủ, bạn tìm thấy mục nào MySqlcó giá trị phiên bản lớn hơn SqlitecurrentVersion (1) sau đó phản hồi với Android (trong ví dụ này, mục 3 với phiên bản 2 sẽ phản hồi với Android)

Trong SQLite, bạn sẽ thêm hoặc cập nhật mục mới todoTablevà nâng cấp currentVersion


1
Ý tưởng của bạn là tuyệt vời nhưng vẫn không thể hiểu đúng thiết kế bảng. Cùng với các dịch vụ nghỉ ngơi và dịch vụ đồng bộ hóa phù hợp, nó hoạt động
Ahesanali Suthar

6

Nhìn vào parsepl platform.org . đó là dự án mã nguồn mở.

(Cũng như bạn có thể sử dụng gói thương mại có sẵn tại back4app.com .)

Đây là một dịch vụ cơ sở dữ liệu phía máy chủ rất thân thiện và dễ sử dụng, cung cấp API phía máy khách Android tuyệt vời


Các kế hoạch miễn phí mà cung cấp là gì?
Prakhar Mohan Srivastava


4
bạn vẫn có thể sử dụng chức năng parse.com, nhưng trên máy chủ của riêng bạn, họ đã mở
geniushkg

3

một cách để thực hiện điều này để có một ứng dụng phía máy chủ chờ dữ liệu. Dữ liệu có thể được gửi bằng HttpRequestcác đối tượng trong Java hoặc bạn có thể viết TCP/IPtiện ích truyền dữ liệu của riêng bạn . Dữ liệu có thể được gửi bằng JSONđịnh dạng hoặc bất kỳ định dạng nào khác mà bạn cho là phù hợp. Ngoài ra dữ liệu có thể được mã hóa trước khi gửi đến máy chủ nếu nó chứa thông tin nhạy cảm. Tất cả các ứng dụng Máy chủ phải làm chỉ là chờ đợi HttpRequestsđể đến và phân tích dữ liệu và lưu trữ bất cứ nơi nào bạn muốn.


Làm cách nào để kiểm tra dữ liệu được cập nhật trong Ứng dụng và máy chủ cục bộ? và làm thế nào để hợp nhất với nhau? Thật không hay khi tôi gửi tất cả các bản ghi bằng JSON hoặc bất kỳ thứ gì đến ứng dụng để hợp nhất chúng. bạn nghĩ sao?
Omid Nazifi

2
bạn có thể sử dụng một cờ, chẳng hạn như "trên máy chủ" với int / bool 1/0 cho có hoặc không. khi một bản ghi / tệp / khối dữ liệu được gửi, hãy kiểm tra thành công tại máy chủ và lật bit sang có. sau đó nếu bạn đang sử dụng một cái gì đó như SQLite, bạn có thể thực hiện kiểu "CHỌN * TỪ my_table WHERE đã gửi = 0" để gửi bất kỳ bản ghi mới nào
Evan R.

1

Tôi sẽ đề nghị sử dụng một giao thức webservice nhị phân tương tự như Hessian . Nó hoạt động rất tốt và họ có một triển khai Android. Nó có thể hơi nặng nhưng phụ thuộc vào ứng dụng bạn đang xây dựng. Hi vọng điêu nay co ich.


1

@Grantismo cung cấp một cái nhìn tổng quan tuyệt vời về các thành phần đồng bộ hóa Android.

Thư viện SyncManagerAndroid cung cấp triển khai đồng bộ hóa 2 chiều đơn giản để cắm vào khung Đồng bộ hóa Android (Tóm tắtThreadedSyncAd Module.OnPerformSync).

https://github.com/sschendel/SyncManagerAndroid

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.