none
Atualizar banco de dados RRS feed

  • Pergunta

  • Boas pessoal,

    Estou com uma dúvida no quesito de atualizar o banco de dados. Só para entenderem, atualmente tenho um banco na pasta da aplicação, e caso uma base ainda não exista, utilizo um método que copia para o IsolatedStorage, exatamente o método deste artigo, MoveReferenceDatabase(). (Link: http://msdn.microsoft.com/en-us/library/hh286411(v=vs.92)).

    Pois bem, agora tenho um cenário diferente. Por ser necessário atualizar a base de dados, cada vez que tiver uma atualização, pretendo baixar um arquivo compactado com um .sdf dentro, e então atualiza-lo no IsolatedStorage e usá-lo normalmente. O problema é: como fazer isso!? Visto que no método que copia o banco para o IsolatedStorage o arquivo esta na pasta da aplicação, e agora não mais. 

    Dei uma pesquisada e encontrei esses dois artigos sobre update do banco, porém esses updates são apenas de estrutura, como adicionar novas colunas, indices, etc.. Na verdade o que preciso seria a atualização dos dados em si. Links(http://msdn.microsoft.com/en-us/library/hh394018(v=vs.92)http://msdn.microsoft.com/en-us/library/hh394022(v=vs.92)).

    Alguem tem alguma sugestão de como isso poderia ser feito?

    Obrigado,

    Thiago

    quarta-feira, 18 de julho de 2012 13:08

Respostas

  • Thiago,

    Eu não tenho costume de anexar o arquivo de banco de dados ao projeto. Normalmente verifico a existência do banco de dados na inicialização da aplicação e, caso não exista, tenho uma rotina que cria as tabelas e faz a carga inicial.

    Caso seja necessário alterar a estrutura do banco de dados, sugiro utilizar um controle de versão para isso. Costumo ter na Isolated Storage a versão da minha APP e quando há a necessidade de atualizar a estrutura, comparo a versão armazenada na Isolated Storage com a versão da nova APP. Se a versão da APP for diferente, atualizo a estrutura do banco e atualizo a versão da APP na Isolated Storage.

    Lembre-se de que a Isolated Storage nunca é apagada nas atualizações da APP, mas somente em caso de desinstalar a APP.

    Tem funcionado muito bem desta maneira e acredito que vai te servir.

    private void VerificaBancoInicial() { using (FingersOnFinanceContext ctx = new FingersOnFinanceContext(sConn)) { //Verificando existência do banco de dados if (!ctx.DatabaseExists()) { ctx.CreateDatabase(); } //Verifica cadastro das Categorias de Despesas var queryCategoria = ctx.FOFkCategoriaDespesas.FirstOrDefault(); if (queryCategoria == null) { var a = new FOFkCategoriaDespesa() { CatDescricao = "Recebimentos", CatTipo = "C", CatStatus = 0 }; ctx.FOFkCategoriaDespesas.InsertOnSubmit(a);

    var b = new FOFkCategoriaDespesa() { CatDescricao = "Despesas eventuais", CatTipo = "D", CatStatus = 0 }; ctx.FOFkCategoriaDespesas.InsertOnSubmit(b);

    var c = new FOFkCategoriaDespesa() { CatDescricao = "Refeições", CatTipo = "D", CatStatus = 0 }; ctx.FOFkCategoriaDespesas.InsertOnSubmit(c);

    ctx.SubmitChanges(); } //Verifica cadastro dos Meios de Pagamento var queryPagamento = ctx.FOFkPagamentoMeios.FirstOrDefault(); if (queryPagamento == null) { var a = new FOFkPagamentoMeio() { PagDescricao = "Dinheiro", PagStatus = 0 }; ctx.FOFkPagamentoMeios.InsertOnSubmit(a);

    var b = new FOFkPagamentoMeio() { PagDescricao = "Transferência Eletrônica", PagStatus = 0 }; ctx.FOFkPagamentoMeios.InsertOnSubmit(b); ctx.SubmitChanges(); } } }

    Acima está um trecho do código onde faço a verificação do banco.

    Também recomendo estes vídeos do Renato Haddad que me foram absolutamente importantes no aprendizado em como trabalhar com banco de dados no WP. Utilizar ferramentas como o SQL Metal facilita muito o trabalho, principalmente para trabalharmos com Entity Framework.   

    Visão geral do SQL Server Compact no Windows Phone 7 - Parte 2
    Neste vídeo (parte 2) Renato ensina como codificar em C# para criar o banco de dados, adicionar e ler dados no banco de dados SQL Compact que será arm...
    terça-feira, jul 26Renato Haddad

    Visão geral do SQL Server Compact no Windows Phone 7 - Parte 1
    Neste vídeo (parte 1) Renato ensina como criar um banco de dados no SQL Compact com o SQL Managment Studio.
    terça-feira, jul 26Renato Haddad    


    Andrey Kurka



    quinta-feira, 19 de julho de 2012 04:24
  • Andrey, show de bola sua idéia, bem prática de usá-la!

    No meu caso não daria certo, devido o grande volume de dados contido nesse banco, se eu for dar um insert inicial cada vez que o banco for atualizado, teria um processo muito custoso, e preciso desses dados já de inicio pra utilizar o aplicativo.

    Ja tinha assistido essas video aulas e estou usando o sql metal desde sempre pra gerar o data context, seguramente é a melhor opção.

    Consegui sanar meu problema usando background file transfers, conforme podem ver nesse artigo http://msdn.microsoft.com/en-us/library/hh202955(v=vs.92).aspx.

    Usando esse mecanismo, consigo baixar um arquivo via http, salva-lo no isolated storage, atualizar a versao do banco de dados e usa-lo. 

    Caso ainda não conheçam, tem um exemplo nesse link onde pode ser feito o download (Link: http://msdn.microsoft.com/en-us/library/ff431744(v=vs.92).aspx), seção background file transfers, agents and alarms.

    Minha ideia tambem envolve salvar a versao no isolated storage, e sempre que a versao do servidor for maior que a local, essa atualização é feita.

    []´s!

    Thiago

    • Marcado como Resposta Thiago Grandesso quinta-feira, 19 de julho de 2012 19:14
    quinta-feira, 19 de julho de 2012 13:52

Todas as Respostas

  • Putz,
    Boa pergunta.


    Passei por um problema atualmente pq meu app mudou a estrutura e nao podia perder os dados.
    quinta-feira, 19 de julho de 2012 03:28
  • Thiago,

    Eu não tenho costume de anexar o arquivo de banco de dados ao projeto. Normalmente verifico a existência do banco de dados na inicialização da aplicação e, caso não exista, tenho uma rotina que cria as tabelas e faz a carga inicial.

    Caso seja necessário alterar a estrutura do banco de dados, sugiro utilizar um controle de versão para isso. Costumo ter na Isolated Storage a versão da minha APP e quando há a necessidade de atualizar a estrutura, comparo a versão armazenada na Isolated Storage com a versão da nova APP. Se a versão da APP for diferente, atualizo a estrutura do banco e atualizo a versão da APP na Isolated Storage.

    Lembre-se de que a Isolated Storage nunca é apagada nas atualizações da APP, mas somente em caso de desinstalar a APP.

    Tem funcionado muito bem desta maneira e acredito que vai te servir.

    private void VerificaBancoInicial() { using (FingersOnFinanceContext ctx = new FingersOnFinanceContext(sConn)) { //Verificando existência do banco de dados if (!ctx.DatabaseExists()) { ctx.CreateDatabase(); } //Verifica cadastro das Categorias de Despesas var queryCategoria = ctx.FOFkCategoriaDespesas.FirstOrDefault(); if (queryCategoria == null) { var a = new FOFkCategoriaDespesa() { CatDescricao = "Recebimentos", CatTipo = "C", CatStatus = 0 }; ctx.FOFkCategoriaDespesas.InsertOnSubmit(a);

    var b = new FOFkCategoriaDespesa() { CatDescricao = "Despesas eventuais", CatTipo = "D", CatStatus = 0 }; ctx.FOFkCategoriaDespesas.InsertOnSubmit(b);

    var c = new FOFkCategoriaDespesa() { CatDescricao = "Refeições", CatTipo = "D", CatStatus = 0 }; ctx.FOFkCategoriaDespesas.InsertOnSubmit(c);

    ctx.SubmitChanges(); } //Verifica cadastro dos Meios de Pagamento var queryPagamento = ctx.FOFkPagamentoMeios.FirstOrDefault(); if (queryPagamento == null) { var a = new FOFkPagamentoMeio() { PagDescricao = "Dinheiro", PagStatus = 0 }; ctx.FOFkPagamentoMeios.InsertOnSubmit(a);

    var b = new FOFkPagamentoMeio() { PagDescricao = "Transferência Eletrônica", PagStatus = 0 }; ctx.FOFkPagamentoMeios.InsertOnSubmit(b); ctx.SubmitChanges(); } } }

    Acima está um trecho do código onde faço a verificação do banco.

    Também recomendo estes vídeos do Renato Haddad que me foram absolutamente importantes no aprendizado em como trabalhar com banco de dados no WP. Utilizar ferramentas como o SQL Metal facilita muito o trabalho, principalmente para trabalharmos com Entity Framework.   

    Visão geral do SQL Server Compact no Windows Phone 7 - Parte 2
    Neste vídeo (parte 2) Renato ensina como codificar em C# para criar o banco de dados, adicionar e ler dados no banco de dados SQL Compact que será arm...
    terça-feira, jul 26Renato Haddad

    Visão geral do SQL Server Compact no Windows Phone 7 - Parte 1
    Neste vídeo (parte 1) Renato ensina como criar um banco de dados no SQL Compact com o SQL Managment Studio.
    terça-feira, jul 26Renato Haddad    


    Andrey Kurka



    quinta-feira, 19 de julho de 2012 04:24
  • Andrey, show de bola sua idéia, bem prática de usá-la!

    No meu caso não daria certo, devido o grande volume de dados contido nesse banco, se eu for dar um insert inicial cada vez que o banco for atualizado, teria um processo muito custoso, e preciso desses dados já de inicio pra utilizar o aplicativo.

    Ja tinha assistido essas video aulas e estou usando o sql metal desde sempre pra gerar o data context, seguramente é a melhor opção.

    Consegui sanar meu problema usando background file transfers, conforme podem ver nesse artigo http://msdn.microsoft.com/en-us/library/hh202955(v=vs.92).aspx.

    Usando esse mecanismo, consigo baixar um arquivo via http, salva-lo no isolated storage, atualizar a versao do banco de dados e usa-lo. 

    Caso ainda não conheçam, tem um exemplo nesse link onde pode ser feito o download (Link: http://msdn.microsoft.com/en-us/library/ff431744(v=vs.92).aspx), seção background file transfers, agents and alarms.

    Minha ideia tambem envolve salvar a versao no isolated storage, e sempre que a versao do servidor for maior que a local, essa atualização é feita.

    []´s!

    Thiago

    • Marcado como Resposta Thiago Grandesso quinta-feira, 19 de julho de 2012 19:14
    quinta-feira, 19 de julho de 2012 13:52
  • Assim vamos aperfeiçoando as técnicas, Thiago!

    A melhor ferramenta que temos é o fórum.

    Lembre-se de que soluções que exigem baixar arquivos necessários para a atualização da versão, podem trazer problemas para usuários no Brasil. Afinal, nossa rede 3G é uma piada de muito mau gosto. Sendo assim, pode comprometer o update da sua aplicação se a rede não colaborar.

    Atualizar a estrutura já é algo mais chato de se fazer via código, mas compensa porque o tamanho da atualização fica menor e mais leve para executar. Até mesmo, porque devemos procurar lançar na primeira versão uma estrutura de banco que contemple o máximo possível de recursos, inclusive para as próximas versões. Faz parte do planejamento da aplicação e ciclo de vida. Na última app que publiquei, consegui deixar o banco de dados pronto para as próximas 5 atualizações, que deve concluir o processo de maturidade da aplicação. O usuário gosta de ver a aplicação ser atualizada porque passa um sentimento de que o investimento foi bem realizado e teve um custo-benefício satisfatório.

    Os dados você pode deixar em um xml dentro do pacote de atualização para, na primeira execução da nova versão, atualizar seu banco de dados da Isolated Storage. Terminada a tarefa de atualização dos dados, remova o arquivo para não ficar ocupando espaço no dispositivo ou planeje a próxima atualização sem o arquivo xml.

    Acho que é isso Thiago... vamos trocando figurinha porque o assunto é bem extenso.

    Abraço!


    Andrey Kurka

    quinta-feira, 19 de julho de 2012 16:42
  • Também estava precisando atualizar a versão do meu aplicativo, sendo assim necessário adicionar algumas colunas em tabelas já existentes.

    Procurando na net encontrei o artigo Walkthrough: Updating a Local Database Application for Windows Phone no MSDN Library.

    No artigo é utilizado o DatabaseSchemaUpdater.DatabaseSchemaVersion para comparar a versão do banco. Achei muito simples de implementar. Funcionou perfeitamente para a minha aplicação.


    Estudando Windows Phone 7 e LightSwitch, muito bom!!!

    sábado, 11 de agosto de 2012 22:57