Sincronizar dados entre o aplicativo Android e o servidor da web [fechado]

262

Quero sincronizar dados (como registro db, mídia) entre um aplicativo Android e um servidor. Se você já viu Evernoteaplicativos ou similares, certamente entende o que quero dizer.

Eu tenho uma pergunta (imagine que queremos sincronizar registros do banco de dados):

  1. Todo usuário possui uma parte do espaço do servidor para si (como Evernoteou Dropbox). Talvez o usuário crie novos registros pelo celular e crie novos registros no servidor. Como posso combinar esses registros juntos? Se houver registros com o mesmo ID Quais algoritmos você me sugere?

  2. Exceto JSON , existe alguma maneira de enviar dados entre o dispositivo celular e o servidor?

  3. Se o SyncAdapter e o ContentProvider puderem resolver meus problemas, explique exatamente para mim. (Se você pudesse me oferecer alguns exemplos ou tutoriais OU Quaisquer conselhos ou palavras-chave para ajudar a ampliar / orientar minha pesquisa também serão apreciados).

Omid Nazifi
fonte
1
Primeiro, você precisa descobrir (decidir) seu protocolo de comunicação com o servidor - daí - quais dados você pode transferir e como.
Hovanessyan
Isso é importante para mim, transfira dados do SQLlite. mas eu saberia como transferir outros dados. Não entendo o que você quer dizer com protocolo. por favor, explique mais.
Omid Nazifi
Por protocolo Quero dizer isso simple.wikipedia.org/wiki/Internet_Protocol
hovanessyan
1
tente o konysync, um produto da konylabs que fornece soluções completas em várias plataformas (android, windows, ios), servidores web, provedores de dados (força de vendas, provedores sap), bancos de dados (sqlserver, mysql ...)
saimadan

Respostas:

311

Tentarei responder a todas as suas perguntas abordando a questão mais ampla: como sincronizar dados entre um servidor da web e um aplicativo Android?


A sincronização de dados entre o servidor da web e um aplicativo Android requer alguns componentes diferentes no seu dispositivo Android.

Armazenamento persistente:

É assim que seu telefone realmente armazena os dados que recebe do servidor da web. Um método possível para fazer isso é escrever seu próprio ContentProvider personalizado, apoiado por um banco de dados Sqlite. Um tutorial decente para um provedor de conteúdo pode ser encontrado aqui: http://thinkandroid.wordpress.com/2010/01/13/writing-your-own-contentprovider/

Um ContentProvider define uma interface consistente para interagir com seus dados armazenados. Também pode permitir que outros aplicativos interajam com seus dados, se você desejar. Por trás do ContentProvider, pode haver um banco de dados Sqlite, um cache ou qualquer mecanismo de armazenamento arbitrário.

Embora eu certamente recomendo usar um ContentProvider com um banco de dados Sqlite, você pode usar qualquer mecanismo de armazenamento baseado em java que desejar.

Formato de intercâmbio de dados:

Este é o formato que você usa para enviar os dados entre o servidor da web e o aplicativo para Android. Os dois formatos mais populares atualmente são XML e JSON. Ao escolher seu formato, você deve pensar sobre que tipo de bibliotecas de serialização estão disponíveis. Sei imediatamente que existe uma biblioteca fantástica para serialização json chamada gson: https://github.com/google/gson , embora eu tenha certeza de que existem bibliotecas semelhantes para XML.

Serviço de Sincronização

Você desejará algum tipo de tarefa assíncrona que possa obter novos dados do servidor e atualizar o conteúdo móvel para refletir o conteúdo do servidor. Você também deseja notificar o servidor sempre que fizer alterações locais no conteúdo e refletir essas alterações. O Android fornece o padrão SyncAdapter como uma maneira de resolver facilmente esse padrão. Você precisará registrar contas de usuário, e o Android executará muita mágica para você e permitirá a sincronização automática. Aqui está um bom tutorial: http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1/


Quanto à forma como você identifica se os registros são os mesmos, normalmente você cria itens com um ID exclusivo que você armazena no dispositivo Android e no servidor. Você pode usar isso para ter certeza de que está se referindo à mesma referência. Além disso, você pode armazenar atributos de coluna como "updated_at" para garantir que você esteja sempre obtendo os dados mais recentes ou se não escreve acidentalmente sobre dados recém-gravados.

Grantismo
fonte
3
E quanto à grande quantidade de dados? como posso sincronizar?
Pratik Butani
4
Muito bem explicado, só tenho uma nota ... SyncAdapter -> "execute muita mágica". Espero que você esteja se referindo como magia negra ... é totalmente maligna.
MRodrigues 5/05
@MRodrigues: SyncAdapter poderia ser magia negra para o desenvolvedor, mas ainda fazer mágica para a estabilidade e funcionalidade, é muito mais melhor do que outros libs
Milad Metias
2
O que o próprio serviço da web exige para sincronizá-lo com um dispositivo Android? É possível com o Spring?
Jublikon
58

Se pensarmos hoje , a resposta aceita é muito antiga. Como sabemos, temos muitas novas bibliotecas que podem ajudá-lo a fazer esse tipo de aplicativo.

Você deve aprender os seguintes tópicos que certamente o ajudarão:

  • SyncAdapter: o componente do adaptador de sincronização no seu aplicativo encapsula o código para as tarefas que transferem dados entre o dispositivo e um servidor. Com base na programação e nos gatilhos fornecidos no aplicativo, a estrutura do adaptador de sincronização executa o código no componente do adaptador de sincronização.

  • Realm : Realm é um banco de dados móvel: um substituto para SQLite e Core Data.

  • Retrofit O cliente HTTP seguro para Android e Java da Square, Inc. deve aprender uma maneira inteligente de usar o retrofit

E sua lógica de sincronização de banco de dados como: Como sincronizar o banco de dados SQLite no telefone Android com o banco de dados MySQL no servidor?

Melhor sorte para todos os novos alunos. :)

Pratik Butani
fonte
Link para um-smart-way-to-use-retrofit está morto
Greg Holst
@GregHolst atualizado.
Pratik Butani 18/01/19
3
Ainda para baixo. Ou requer login? Archive.org tem: web.archive.org/web/20160316222227/https://futurestud.io/blog/...
bobpaul
24

Se você mesmo escrever, estes são alguns dos pontos a serem lembrados

Autenticação adequada entre o dispositivo e o Sync Server

Um protocolo de sincronização entre o dispositivo e o servidor. Geralmente ocorre em 3 fases, autenticação, troca de dados, troca de status (quais operações funcionaram e quais falharam)

Escolha seu formato de carga. Sugiro XML baseado em SyncML misturado com formato baseado em JSON para representar os dados reais. Então SyncML para o protocolo e JSON para os dados reais sendo trocados. O uso do JSON Array ao manipular os dados é sempre preferido, pois é fácil acessar dados usando o JSON Array.

Acompanhar as alterações de dados no cliente e no servidor. Você pode manter um registro de alterações dos IDs que são alterados e buscá-los durante uma sessão de sincronização. Além disso, limpe o log de alterações, pois os objetos são sincronizados com êxito. Você também pode usar uma variável booleana para confirmar o status da sincronização, ou seja, a última hora da sincronização. Será útil para os usuários finais identificar a hora em que a última sincronização é feita.

É necessário ter uma maneira de se comunicar do servidor para o dispositivo para iniciar uma sessão de sincronização conforme os dados mudam no servidor. Você pode usar o C2DM ou escrever sua própria comunicação persistente baseada em tcp. A abordagem TCP é muito transparente

Uma maneira de replicar alterações de dados em vários dispositivos

E por último, mas não menos importante, uma maneira de detectar e lidar com conflitos

Espero que isso ajude como um bom ponto de partida.

openmobster
fonte
14

O @Grantismo fornece uma ótima explicação geral. Se você deseja saber quem as pessoas realmente estão fazendo isso, sugiro que você dê uma olhada em como o Google fez para o Google IO App de 2014 (sempre vale a pena dar uma olhada profunda no código fonte desses aplicativos que eles lançam. muito a aprender com isso).

Aqui está uma postagem do blog sobre isso: http://android-developers.blogspot.com.br/2014/09/conference-data-sync-gcm-google-io.html

Essencialmente, no lado do aplicativo: GCM para sinalização, Sync Adapter para busca de dados e conversação adequada com o Provedor de Conteúdo que tornará as coisas persistentes (sim, isola o banco de dados do acesso direto de outras partes do aplicativo).

Além disso, se você quiser dar uma olhada no código de 2015: https://github.com/google/iosched

Ciro Costa
fonte
O código fonte do aplicativo Google IO é IMO bastante útil!
Richeek 11/01
10

Por exemplo, você deseja sincronizar a tabela todoTablede MySqlparaSqlite

Primeiro, crie um nome de coluna version (type INT)em todoTabletanto para SqliteeMySql insira a descrição da imagem aqui

Segundo, crie um nome de tabela database_versioncom um nome de colunacurrentVersion(INT)
insira a descrição da imagem aqui

Em MySql, ao adicionar um novo item todoTableou atualizar um item, você deve atualizar a versão deste item com +1 e também atualizar ocurrentVersion insira a descrição da imagem aqui

Em Android, quando você deseja sincronizar (pressione manualmente o botão sincronizar ou um serviço executado com o período):

Você enviará a solicitação com a SqlitecurrentVersion (atualmente é 1) para o servidor.
Em seguida, no servidor, você encontra em qual item o MySqlvalor da versão é maior que SqlitecurrentVersion (1) e responde ao Android (neste exemplo, o item 3 da versão 2 responde ao Android)

Em SQLite, você adicionará ou atualizará um novo item todoTablee atualizará o currentVersion

Phan Van Linh
fonte
1
Sua ideia é brilhante, mas ainda não consegue entender o design da tabela corretamente. Juntamente com os serviços de descanso e serviço de sincronização adequada funciona
Ahesanali Suthar
6

Veja parseplatform.org . é um projeto de código aberto.

(Além disso, você pode procurar o pacote comercial disponível em back4app.com .)

É um serviço de banco de dados do servidor muito simples e fácil de usar, que oferece uma excelente API do lado do cliente Android

Kyle
fonte
Quais são os planos gratuitos que a oferta oferece?
Prakhar Mohan Srivastava
12
http://parse.com/ está desligado.
Chintan Rathod
4
você ainda pode usar parse.com funcionalidade, mas em seu próprio servidor, eles têm Open Source
geniushkg
3

Uma maneira de fazer isso é ter um aplicativo no servidor que aguarde os dados. Os dados podem ser enviados usando HttpRequestobjetos em Java ou você pode gravar seu próprio TCP/IPutilitário de transferência de dados. Os dados podem ser enviados usando o JSONformato ou qualquer outro formato que você considere adequado. Os dados também podem ser criptografados antes de serem enviados ao servidor, se contiverem informações confidenciais. Tudo o que o aplicativo Server precisa fazer é apenas aguardar HttpRequestsa entrada e analisar os dados e armazená-los onde quiser.

Mayank
fonte
Como verificar os dados atualizados no aplicativo e servidor local? e como mesclar juntos? Não é bom enviar todos os registros por JSON ou qualquer coisa para o pedido de mesclagem. O que você acha?
Omid Nazifi
2
você pode usar um sinalizador, como "no servidor", com um int / bool 1/0 para sim ou não. quando um registro / arquivo / bloco de dados for enviado, verifique o sucesso no servidor e vire o bit para yes. em seguida, se você estiver usando algo como SQLite, você pode fazer um "SELECT * FROM minha_tabela ONDE enviado = 0" tipo de coisa para enviar quaisquer novos registros
Evan R.
1

Eu sugeriria o uso de um protocolo binário de serviço da web semelhante ao Hessian . Funciona muito bem e eles têm uma implementação android. Pode ser um pouco pesado, mas depende do aplicativo que você está construindo. Espero que isto ajude.

Neo
fonte
1

O @Grantismo fornece uma ótima visão geral dos componentes de sincronização do Android.

A biblioteca SyncManagerAndroid fornece uma implementação de sincronização bidirecional simples para conectar-se à estrutura do Android Sync (AbstractThreadedSyncAdapter.OnPerformSync).

https://github.com/sschendel/SyncManagerAndroid

Sean
fonte