Android 앱과 웹 서버 간 데이터 동기화 [닫기]


262

Android 앱과 서버간에 데이터 (예 : db 레코드, 미디어)를 동기화하고 싶습니다. 당신이 Evernote응용 프로그램을 보거나 유사한 경우에 , 당신은 확실히 내가 무슨 뜻인지 이해합니다.

질문이 있습니다 (DB 레코드를 동기화하려고한다고 상상해보십시오).

  1. 모든 사용자는 자신을 위해 서버 공간의 일부를 갖습니다 (예 : Evernote또는 Dropbox). 사용자가 휴대폰으로 새 레코드를 만들고 서버에 새 레코드를 만들 수도 있습니다. 이 기록들을 어떻게 일치시킬 수 있습니까? 동일한 ID의 레코드가있는 경우 어떤 알고리즘을 제안합니까?

  2. 를 제외하고 JSON , 휴대 전화 장치와 서버 사이의 전송 데이터를 어떤 방법이 있습니까?

  3. SyncAdapterContentProvider 가 내 문제를 해결할 수 있으면 정확히 설명해주세요. (나에게 샘플이나 자습서를 제공 할 수 있거나 검색을 넓히고 안내하는 데 도움이되는 조언이나 키워드가 있으면 감사하겠습니다.)


1
먼저 서버와의 통신 프로토콜을 파악 (결정)하여 전송할 수있는 데이터와 방법을 결정해야합니다.
hovanessyan

그것은 저에게 중요합니다. SQLlite 데이터를 전송하십시오. 그러나 다른 데이터를 전송하는 방법을 알고 싶습니다. 프로토콜에 대한 당신의 의미를 이해하지 못합니다. 더 설명 해주세요.
Omid Nazifi

프로토콜에 의해 나는 이것이 simple.wikipedia.org/wiki/Internet_Protocol
hovanessyan 10

1
다양한 플랫폼 (android, windows, ios), 웹 서버, 데이터 공급자 (Salesforce,
Sap

답변:


311

나는 더 큰 문제를 해결하여 모든 질문에 대답하려고합니다 : 웹 서버와 안드로이드 응용 프로그램 사이에 내가 어떻게 동기화 데이터를?


웹 서버와 안드로이드 앱간에 데이터를 동기화하려면 안드로이드 장치에 몇 가지 다른 구성 요소가 필요합니다.

영구 스토리지 :

이것은 휴대 전화가 웹 서버에서 수신 한 데이터를 실제로 저장하는 방법입니다. 이를 수행하는 한 가지 가능한 방법 은 Sqlite 데이터베이스가 지원하는 사용자 정의 ContentProvider를 작성하는 것 입니다. 콘텐츠 제공 업체를위한 훌륭한 튜토리얼은 여기 ( http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/) 에서 찾을 수 있습니다.

컨텐트 프로는 저장된 데이터와 상호 작용하는 일관된 인터페이스를 정의합니다. 원하는 경우 다른 응용 프로그램이 데이터와 상호 작용할 수도 있습니다. ContentProvider 뒤에는 Sqlite 데이터베이스, 캐시 또는 임의의 스토리지 메커니즘이있을 수 있습니다.

Sqlite 데이터베이스와 함께 ContentProvider 를 사용하는 것이 좋습니다 . 원하는 Java 기반 저장 메커니즘을 사용할 수 있습니다.

데이터 교환 형식 :

이것은 웹 서버와 안드로이드 앱간에 데이터를 보내는 데 사용하는 형식입니다. 요즘 가장 인기있는 두 가지 형식은 XML과 JSON입니다. 형식을 선택할 때는 어떤 종류의 직렬화 라이브러리를 사용할 수 있는지 고려해야합니다. 나는 XML에 대해 비슷한 라이브러리가 있다고 확신하지만 gson : https://github.com/google/gson 이라는 환상적인 json 직렬화 라이브러리가 있다는 것을 알고 있습니다 .

동기화 서비스

서버에서 새 데이터를 가져오고 서버의 내용을 반영하도록 모바일 내용을 새로 고칠 수있는 일종의 비동기 작업이 필요합니다. 컨텐츠를 로컬로 변경하고 해당 변경 사항을 반영 할 때마다 서버에 알리려고합니다. Android는 이 패턴을 쉽게 해결할 수있는 방법으로 SyncAdapter 패턴을 제공합니다 . 사용자 계정을 등록해야합니다. 그러면 Android에서 많은 마법을 수행하고 자동으로 동기화 할 수 있습니다. 다음은 좋은 자습서입니다. http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


레코드가 동일한 지 식별하는 방법에 관해서는 일반적으로 안드로이드 장치와 서버 모두에 저장하는 고유 ID를 가진 항목을 생성합니다. 이를 사용하여 동일한 참조를 참조하고 있는지 확인할 수 있습니다. 또한 "updated_at"와 같은 열 속성을 저장하여 항상 최신 데이터를 얻거나 실수로 새로 쓴 데이터를 덮어 쓰지 않도록 할 수 있습니다.


3
많은 양의 데이터는 어떻습니까? 어떻게 동기화 할 수 있습니까?
Pratik Butani

4
아주 잘 설명했습니다 ... SyncAdapter-> "많은 마술을 수행하십시오". 나는 당신이 그것을 흑 마법이라고 언급하기를 바랍니다. 그것은 완전히 악합니다.
MRodrigues

@MRodrigues : SyncAdapter는 개발자에게 흑 마법 일 수 있지만 여전히 안정성과 기능성에있어 마법을 발휘합니다. 다른 라이브러리보다 훨씬 낫습니다
Milad Metias

2
웹 서비스 자체는 안드로이드 장치와 동기화하기 위해 무엇이 필요합니까? Spring으로 가능합니까?
jublikon

58

우리가 생각한다면 오늘 , 허용 대답은 너무 오래되었습니다. 아시다시피 이러한 유형의 응용 프로그램을 만드는 데 도움이되는 새로운 라이브러리가 많이 있습니다.

반드시 도움이되는 다음 주제를 배워야합니다.

  • SyncAdapter : 앱의 동기화 어댑터 구성 요소는 장치와 서버간에 데이터를 전송하는 작업에 대한 코드를 캡슐화합니다. 앱에서 제공하는 예약 및 트리거에 따라 동기화 어댑터 프레임 워크는 동기화 어댑터 구성 요소에서 코드를 실행합니다.

  • Realm : Realm은 모바일 데이터베이스입니다 : SQLite & Core Data를 대체합니다.

  • 개조 유형 안전 스퀘어 안드로이드와 자바에 대한 HTTP 클라이언트, Inc.는 배워야 A-스마트 방식으로 사용할 수있는-개조를

그리고 데이터베이스에 대한 동기화 논리 : Android 전화의 SQLite 데이터베이스를 서버의 MySQL 데이터베이스와 동기화하는 방법은 무엇입니까?

모든 새로운 학습자에게 행운을 빕니다. :)


똑똑한 방법으로 사용하여 개조하는 링크로 연결이
Greg Holst

@GregHolst가 업데이트되었습니다.
Pratik Butani

3
아직도 아래로. 아니면 로그인이 필요합니까? Archive.org가 있습니다 web.archive.org/web/20160316222227/https://futurestud.io/blog/...
bobpaul

24

직접 작성하면 명심해야 할 몇 가지 사항이 있습니다.

장치와 동기화 서버 간의 올바른 인증

장치와 서버 간의 동기화 프로토콜 일반적으로 인증, 데이터 교환, 상태 교환 (작업이 작동 및 실패)의 3 단계로 진행됩니다.

페이로드 형식을 선택하십시오. 실제 데이터를 나타 내기 위해 SyncML 기반 XML을 JSON 기반 형식과 혼합하는 것이 좋습니다. 따라서 프로토콜의 경우 SyncML, 교환되는 실제 데이터의 경우 JSON입니다. JSON 배열을 사용하여 데이터에 쉽게 액세스 할 수 있으므로 데이터 조작 중에 JSON 배열을 사용하는 것이 항상 선호됩니다.

클라이언트와 서버의 데이터 변경 사항을 추적합니다. 동기화 세션 중에 변경되는 ID의 변경 로그를 유지 관리 할 수 ​​있습니다. 또한 객체가 성공적으로 동기화되면 변경 로그를 지우십시오. 부울 변수를 사용하여 동기화 상태 (예 : 마지막 동기화 시간)를 확인할 수도 있습니다. 최종 사용자가 마지막 동기화가 완료된 시간을 식별하는 데 도움이됩니다.

서버에서 데이터가 변경 될 때 동기화 세션을 시작하려면 서버에서 장치로 통신하는 방법이 필요합니다. C2DM을 사용하거나 고유 한 영구 TCP 기반 통신을 작성할 수 있습니다. TCP 접근 방식은 매우 원활합니다.

여러 장치에서 데이터 변경 사항을 복제하는 방법

마지막으로 갈등을 감지하고 처리하는 방법

이것이 좋은 출발점이되기를 바랍니다.


14

@Grantismo는 전체에 대한 훌륭한 설명을 제공합니다. 사람들이 실제로이 일을하고있는 사람을 알고 싶다면 2014 년 Google IO 앱에서 Google이 어떻게했는지 살펴 보는 것이 좋습니다. 거기에서 배울 것이 많습니다).

여기에 대한 블로그 게시물이 있습니다. http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

기본적으로 응용 프로그램 측면에서 : 시그널링을위한 GCM, 데이터를 가져오고 컨텐츠 제공자와 올바르게 대화하기위한 Sync Adapter는 데이터를 지속적으로 유지합니다 (예, DB가 앱의 다른 부분에서 직접 액세스하는 것을 차단합니다).

또한 2015 코드를 살펴 보려면 https://github.com/google/iosched


Google IO 앱의 소스 코드는 매우 유용한 IMO입니다!
Richeek

10

예를 들어, 테이블 todoTableMySql에서Sqlite

첫째, 하나의 열 이름을 만들 version (type INT)todoTable모두 SqliteMySql 여기에 이미지 설명을 입력하십시오

둘째, database_version하나의 열 이름 으로 테이블 이름 을 만듭니다.currentVersion(INT)
여기에 이미지 설명을 입력하십시오

에서 MySql당신이 새 항목을 추가 할 때, todoTable업데이트 항목이나, 당신은 +1이 항목의 버전을 업그레이드해야합니다 또한 업그레이드currentVersion 여기에 이미지 설명을 입력하십시오

에서 Android, 당신은 (수동 눌러 동기화 버튼 또는 기간 시간 운영하는 서비스에 의해) 동기화 할 때 :

SqlitecurrentVersion (현재 1) 의 요청 을 서버로 보냅니다.
그런 다음 서버에서 currentVersion (1) MySql보다 큰 버전 값 을 가진 항목을 찾은 Sqlite다음 Android에 응답합니다 (이 예에서는 버전 2가있는 항목 3이 Android에 응답 함)

에서 SQLite새 항목을 추가 또는 업데이트 todoTable하고 currentVersion을 업그레이드합니다.


1
당신의 아이디어는 훌륭하지만 여전히 테이블 디자인을 제대로 이해할 수 없습니다. 휴식 서비스 및 적절한 동기화 서비스와 함께 작동
Ahesanali Suthar

6

parseplatform.org보십시오 . 오픈 소스 프로젝트입니다.

( back4app.com 에서 구할 수있는 상용 패키지를 이용할 수도 있습니다.)

그것은 매우 안드로이드 클라이언트 측 API를 제공하는 매우 간단하고 사용자 친화적 인 서버 측 데이터베이스 서비스입니다


제안하는 무료 플랜은 무엇입니까?
Prakhar Mohan Srivastava

12
http://parse.com/ 이 종료되었습니다.
Chintan Rathod

4
당신은 여전히 기능하지만, 자신의 서버에, 그들이 opensourced 한 parse.com 사용할 수 있습니다
geniushkg

3

데이터를 기다리는 서버 측 응용 프로그램을 갖기위한 방법 중 하나입니다. HttpRequestJava의 오브젝트를 사용하여 데이터를 보내 거나 고유 한 TCP/IP데이터 전송 유틸리티를 작성할 수 있습니다 . 데이터는 JSON형식 또는 적합한 다른 형식을 사용하여 전송할 수 있습니다 . 또한 중요한 정보가 포함 된 경우 서버로 전송하기 전에 데이터를 암호화 할 수 있습니다. 모든 서버 응용 프로그램은 HttpRequests들어 와서 데이터를 구문 분석하여 원하는 위치에 저장하기 만하면 됩니다.


로컬 앱 및 서버에서 업데이트 된 데이터를 확인하는 방법은 무엇입니까? 그리고 어떻게 합병 하는가? JSON 또는 모든 항목을 병합하기 위해 모든 레코드를 애플리케이션으로 전송하는 것은 좋지 않습니다. 어떻게 생각해?
Omid Nazifi

2
예 또는 아니오에 int / bool 1/0과 함께 "서버"와 같은 플래그를 사용할 수 있습니다. 레코드 / 파일 / 데이터 블록이 전송되면 서버에서의 성공 여부를 확인하고 비트를 yes로 전환하십시오. 그런 다음 SQLite와 같은 것을 사용하는 경우 "SELECT * FROM my_table WHERE sent = 0"유형 작업을 수행하여 새 레코드를 보낼 수 있습니다.
Evan R.

1

Hessian 과 유사한 이진 웹 서비스 프로토콜을 사용하는 것이 좋습니다 . 그것은 잘 작동하며 안드로이드 구현이 있습니다. 약간 무거울 수 있지만 구축중인 응용 프로그램에 따라 다릅니다. 도움이 되었기를 바랍니다.


1

@Grantismo는 Android 동기화 구성 요소에 대한 훌륭한 개요를 제공합니다.

SyncManagerAndroid 라이브러리는 Android 동기화 프레임 워크 (AbstractThreadedSyncAdapter.OnPerformSync)에 플러그인하기위한 간단한 양방향 동기화 구현을 제공합니다.

https://github.com/sschendel/SyncManagerAndroid

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.