Quero sincronizar dados (como registro db, mídia) entre um aplicativo Android e um servidor. Se você já viu Evernote
aplicativos ou similares, certamente entende o que quero dizer.
Eu tenho uma pergunta (imagine que queremos sincronizar registros do banco de dados):
Todo usuário possui uma parte do espaço do servidor para si (como
Evernote
ouDropbox
). 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?Exceto JSON , existe alguma maneira de enviar dados entre o dispositivo celular e o servidor?
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).
fonte
Respostas:
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.
fonte
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. :)
fonte
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.
fonte
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
fonte
Por exemplo, você deseja sincronizar a tabela
todoTable
deMySql
paraSqlite
Primeiro, crie um nome de coluna
version (type INT)
emtodoTable
tanto paraSqlite
eMySql
Segundo, crie um nome de tabela
database_version
com um nome de colunacurrentVersion(INT)
Em
MySql
, ao adicionar um novo itemtodoTable
ou atualizar um item, você deve atualizar a versão deste item com +1 e também atualizar ocurrentVersion
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
Sqlite
currentVersion (atualmente é 1) para o servidor.Em seguida, no servidor, você encontra em qual item o
MySql
valor da versão é maior queSqlite
currentVersion (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 itemtodoTable
e atualizará o currentVersionfonte
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
fonte
Uma maneira de fazer isso é ter um aplicativo no servidor que aguarde os dados. Os dados podem ser enviados usando
HttpRequest
objetos em Java ou você pode gravar seu próprioTCP/IP
utilitário de transferência de dados. Os dados podem ser enviados usando oJSON
formato 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 aguardarHttpRequests
a entrada e analisar os dados e armazená-los onde quiser.fonte
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.
fonte
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
fonte