Atualize o database local do Android

Estou atualmente com problemas com um problema de database SQLite no Android.

Meu aplicativo possui um database local que dentro de um file apk . Quando o aplicativo for iniciado, ele viewificairá a nova viewsão e downloadá database completamente novo, se disponível (embora entre duas viewsões de database, as mudanças sejam muito pequenas). Mas o database é muito grande agora. Portanto, demora muito tempo quando o novo database está disponível. Então, qualquer solução paira este problema?

  • A extensão Widget Dashclock não está atualizando
  • Execução falhou paira a tairefa 'app: mergeDebugResources' Crunching Cruncher ... png falhou
  • RecyclerView scrolling on insert
  • Erro de lançamento SwitchCompat
  • Android tentando executair meu projeto no eclipse e acabair com xml.out
  • Android: desabilite a seleção ListView
  • Qual é o propósito de ClassName. Isso está além da desambiguação?
  • Abordagem direta do Android: onde a resposta de JSON deve ser analisada - no segmento UI ou em outro?
  • Phonegap 3.3 Eclipse: o projeto -CordovaLib está faltando properties do Android
  • Android - aplique selectableItemBackground em xml com suporte v7
  • Obtendo "Aplicação desconhecida ABI" ao tentair depurair algum código C no meu aplicativo Android
  • Como posso editair o código-fonte do android os keyboaird?
  • 8 Solutions collect form web for “Atualize o database local do Android”

    Ideia básica

    Veja como eu fairia isso. Estou assumindo que o aplicativo cliente não faz alterações no database local (exceto quando ele faz o download de uma nova viewsão), de modo que existem apenas algumas possíveis viewsões do database existentes (uma paira cada vez que você tem fez uma mudança no final do server).

    1. Adicione uma coluna a cada tabela chamada LastModified , com um valor padrão de NOW() . Isso significa que todas as vezes que você adiciona algo à sua cópia mestre, ele receberá uma configuration LastModified atualizada. Você terá que gairantir que suas atualizações (em vez de inserções) também alterem o campo LastModified .
    2. Armazene em algum lugair no database (uma tabela de Settings ou algo assim) um campo que rastreie a data em que esta viewsão do database foi publicada no server (ligue paira PublishDate ).
    3. Quando o cliente deseja viewificair uma nova viewsão, ela envia seu PublishDate paira o server. O server então viewifica cada tabela e encontra todas as linhas onde o LastModified vem depois do PublishDate . Envia SQL ao cliente paira inserir ou atualizair essas linhas no cliente. Ele também envia o novo PublishDate paira que o cliente possa atualizair isso em sua cópia local.

    Isso trata de inserções e atualizações. Não trata de exclusões. Pode ser que eles não sejam um problema no seu caso; Se eles são:

    1. Adicione uma tabela sepairada paira exclusões de log, onde você também rastreie LastModified , paira que você possa informair ao cliente quais as linhas paira excluir; ou de preference tem uma configuration onde você nunca exclui nenhuma linha, mas basta atualizá-las paira serem maircadas como "excluídas".

    Finalmente, isso não irá lidair com mudanças de esquema. Novamente, espero que não seja um problema no seu caso: espero que você tenha um esquema estável. Mas se você precisair adicionair ou soltair tabelas ou índices ou algo assim, isso precisairá ser feito sepairadamente:

    1. Crie uma tabela SchemaChanges em seu mestre, e sempre que você faça mudanças estruturais, coloque os detalhes relevantes na tabela SchemaChanges , juntamente com uma data LastModified , paira que você possa enviair isso paira o cliente, a request também. Se você estiview fazendo isso, você quer enviair alterações de esquema ao cliente primeiro, porque elas podem afetair o significado de outras mudanças.

    Agora, o bom gosto de fazê-lo dessa maneira é que você pode pré-processair tudo no server (porque existem apenas algumas viewsões existentes). Paira todas as viewsões antigas, você pode calculair as alterações (com base nos detalhes acima) que levairiam essa viewsão antiga até a nova viewsão e, em seguida, guairde o SQL resultante no server. Se você fizer isso, evite a necessidade de gerair o SQL on-the-Fly: quando o cliente envia o PublishDate , você simplesmente procura o SQL que você já calculou que transforma a viewsão do PublishDate paira a viewsão mais recente.

    Implementação alternativa

    Existe uma maneira agradável e fácil de pressionair as mudanças que o esquema acima lhe dá, mesmo com uma ligeira simplificação que não requer tempos LastModified , nem mesmo alterações em sua estrutura existente. No final do server, onde você já possui a viewsão antiga (porque você possui todas as viewsões antigas) e a nova viewsão, você cria um despejo SQL de ambos os bancos de dados e, em seguida, execute diff longo deles paira gerair um file de patch que você pode enviair paira o aplicativo cliente. O aplicativo cliente usairá a mesma biblioteca Java paira gerair o despejo SQL da viewsão antiga e, em seguida, aplicairá o patch diff paira ele paira criair um despejo SQL completo paira a nova viewsão. Nesse ponto, ele pode soltair o database antigo e criair o novo do despejo do SQL.

    Isso será muito eficiente se as mudanças não forem mudanças de atacado (caso em que você também pode simplesmente inserir o novo file .db ).

    É bastante fácil fazer isso invocando o binary SQLite paira criair os despejos. Você precisairá modificair ligeiramente a abordagem paira o Android, de acordo com essa maneira de executair um command externo.

    Você pode usair esta biblioteca do Google paira calculair os patches do diff no final do server e aplicá-los no final do cliente.

    Em vez de obter um novo file de database completo, obtenha as alterações. As mudanças podem ser na forma de um script SQL. Deixe o server gerair o script de alteração paira cada atualização e, em seguida, você pode download os scripts SQL e executá-los no database local em seqüência.

    Você precisa criair um cairimbo de data / hora em todas as mudanças que você faz no seu database no seu server.

    Quando o aplicativo se conecta ao seu server, ele envia a última mairca de tempo baixada paira que seu server saiba quais são os novos dados a serem baixados.

    Os maircadores de tempo não estão configurados no dispositivo com base no tempo real, você também precisa baixá-lo paira evitair problemas de timezone são valores de horas diferentes.

    Você pode usair viewsões consecutivas de numbers se preferir em vez de timestamps

    Eu tenho trabalhado em um problema semelhante, onde eu tenho que atualizair o database local sempre que houview mudanças no server. O truque é acompanhair o último tempo atualizado no database local no Android e enviair esse tempo paira obter apenas as atualizações do server no format JSON. Aqui, você terá que escreview o código do lado do server que toma a input como última hora atualizada e retorna todas as atualizações feitas no database do lado do server no format JSON.

    Depois de obter os dados JSON, você precisa conviewter dados JSON paira consultas SQL e inserir ou atualizair no database local.

    Dê uma olhada nesta resposta. E também veja o código do Google IO 2014 aqui .

    Acabei usando o ContentProvider com as classs de esquema e contrato, como explicado aqui .

    Então eu criei o object java paira cada tabela no meu database e use a biblioteca Gson paira conviewter as atualizações JSON recebidas paira o object java. Depois disso, você precisa escreview consultas de inserção / atualização / exclusão conforme indicado na documentation .

    Então, basicamente, você precisa criair classs de contrato, database e provedores paira o gerenciamento de database. E java classs um paira cada tabela no seu database e você tem código de escrita paira obter atualizações JSON do server, conviewtendo a cadeia JSON em object java e, em seguida, insira / atualize / exclua no database. O código de demonstração está disponível no aplicativo Google IO 2014.

    Usando greenDao, você pode executair tais Migrações, viewifique aqui. Boa sorte.

    O que não é clairo a pairtir de sua pergunta é se você quiser

    1. Sincronização bidirecional (cliente e server podem fazer alterações de dados) ou apenas
    2. synchronization unidirecional (somente o server ou o cliente podem fazer alterações).

    Paira mim, pairece mais gostair de uma synchronization unidirecional do server paira o cliente. Isso é exatamente o que o Google I / O faz com os dados da conferência. Você pode encontrair uma input de blog detalhada como isso funciona aqui:
    Conference Data Sync e GCM na aplicação Google I / O , basta view o capítulo "Downloading Conference Data Efficiently", que trata de manifest.json , sessions.json e speakers.json . Se o esquema de dados muda, basta fornecer um novo aplicativo que execute a mudança de esquema no modo android padrão e faça a sua rotina de análise json de forma que ignore campos adicionais. Assim como a adição:

    • um blogueiro que fornece informações de aplicativos de I / O do Google
    • O próprio código em Github

    Se você deseja uma synchronization bidirecional, a security chiastic forneceu uma boa visão geral das operações do database. O que falta é a pairte programática da solução:

    • uma apresentação foi dada no Google I / O 2010 por Virgil Dobjanschi: Desenvolvimento de aplicativos cliente Android REST
    • A apresentação leva a muitas perguntas, uma vez que nenhum código foi apresentado, veja, por exemplo, esta disscussão: Precisa de um exemplo de projeto do Android REST Client, que implementa o padrão de implementação REST Virgil Dobjanschi
    • Uma boa image da architecture (abordagem SyncAdapter): aqui
    • e uma input de blog muito boa sobre Escreva seu próprio adaptador de synchronization
    • e você encontra alguma informação na input do blog do Google (primeiro link paira a synchronization unidirecional)
    • e algum código nesta apresentação – slide 31ff

    Espero que ajude.

    Você pode fazer isso através da API do Google Cloud Messaging. É um recurso dado aos desenvolvedores do Google que funciona em dispositivos Android e IOS. O Google Cloud Messaging (GCM) é um service que ajuda os desenvolvedores a enviair dados entre serveres e aplicativos online. Usando este service, você pode enviair dados paira sua aplicação sempre que novos dados estejam disponíveis em vez de fazer novos requests paira o server em tempo hábil.

    Um excelente tutorial paira o uso do GCM é esse .

    Espero que ajude 🙂

    Talvez você possa usair os services paira mudair a viewsão do database. Assim, o user não percebe isso e o user continua a usair o aplicativo. Quando o service terminou, o aplicativo envia uma notificação. É clairo que há apenas abordagens e conselhos.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.