none
Linq to Sql em App Universal (WP8.1, Win8.1) RRS feed

  • Discussão Geral

  • Sempre criei banco de dados em meus apps com Linq to Sql, mas no WP8.1 não estou conseguindo, parece que não ta dando suporte a tal coisa.

    Como meu projeto trabalha bastante com datas o SqLite é realmente muito limitado, com isso eu gostaria de saber se existe alguma forma de eu ainda utilizar o Sql to Linq ou criar algum tipo de banco de dados orientado a objeto localmente.

    Como se trata de uma aplicação financeira, poderá ter bastante registro, então eu nao quero armazenar JSON ou XML para trabalhar com os dados, preciso de fato um banco local que tenha boa performance.

    Alguém pode dar alguma dica?



    Paulo Rogerio

    sexta-feira, 27 de março de 2015 14:58

Todas as Respostas

  • Galera estou fazendo um aplicativo universal e resolvi utilizar o Sqlite, e particularmente não gostei muito por conta de algumas limitações. Porém resolvi continuar o projeto e preciso fazer uma query que filtre pelo ano da data de vencimento e pelo perfil selecionado.

    Essa query ja existia em outro app utilizando linq to sql, mas como o sqlite chora quando usa expressões lambda, só algumas simples expressões ele aceita, eu resolvi fazer uma query na mão.

    StringBuilder sqlTemp = new StringBuilder();
                    sqlTemp.Append("select ");
                    sqlTemp.Append(" t.TransacaoID, ");
                    sqlTemp.Append(" t.TransacaoIDPai, ");
                    sqlTemp.Append(" t.CategoriaID, ");
                    sqlTemp.Append(" c.Nome as NomeCategoria,  ");
                    sqlTemp.Append(" t.ContaID, ");
                    sqlTemp.Append(" co.Nome as NomeConta, ");
                    sqlTemp.Append(" t.Descricao, ");
                    sqlTemp.Append(" t.Valor, ");
                    sqlTemp.Append(" t.DataVencimento, ");
                    sqlTemp.Append(" t.TipoTransacao, ");
                    sqlTemp.Append(" t.TipoRepeticao, ");
                    sqlTemp.Append(" t.ERepeticao, ");
                    sqlTemp.Append(" t.CicloQuebrado, ");
                    sqlTemp.Append(" t.Quitado, ");
                    sqlTemp.Append(" t.Avisar ");
                    sqlTemp.Append(" from Transacao t ");
                    sqlTemp.Append(" inner join Categoria c on c.CategoriaID = t.CategoriaID ");
                    sqlTemp.Append(" inner join Conta co on co.ContaID = t.ContaID ");
                    sqlTemp.Append(" Where 1=1");
                    sqlTemp.Append("  and c.PerfilID=? ");
                    sqlTemp.Append(" and  strftime('%Y', t.DataVencimento)='?'");


                    string sql = sqlTemp.ToString() ;
                    List<DtoTransacao> dtoTransacaoCollection = conn.Query<DtoTransacao>(sql, perfilID, anoSelecionado);



    Infelizmente o ano não é filtrado. Deduzo que é necessário fazer um cast do DataVencimento para YYYY-MM-DD mas no Sqlite não faço ideia de como resolver isso.

                    

    Paulo Rogério

    sexta-feira, 27 de março de 2015 02:59
  • Paulo boa noite,

    Antes de tudo pare com essa historia de SQLitle isso é para aplicação mobile e não para aplicações de grandes buscas por conta da sua limitação.

    O que recomendo a fazer é utilizar um base de dados mais robustas que entenda melhor a linguagem de SQL.

    Agora vamos ao seu problema 

    https://technet.microsoft.com/pt-br/library/ms191311(v=sql.105).aspx

    Neste link tem explicações diretas de como fazer uma busca em uma base por intervalo, só basta você criar a busca da forma que deseja de uma lida. 

    Dessa forma você ganha desempenho e tempo.

    Abraços 


    Matheus Leopardi Mello Canelada Campos

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    TechNet Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 2 de abril de 2015 02:29
  • Boa noite Paulo,

    Uma duvida antes de tentar lhe ajudar.

    Essa base precisa ficar no celular ? Que ate aonde vai meu entendimento o SQLitle fica armazenando no celular.

    O que recomendo é utilizar banco de dados nas nuvens com autenticação e segurança.

    Outra coisa é qual a sua demanda para essa base o volume propriamente dita.

    Abraços

    PS.

    Segue alguns links de hospedagem em nuvem.

    http://wat-docs.azurewebsites.net/JsonWindows

    http://blogs.msdn.com/b/pakistan/archive/2013/06/14/getting-started-with-web-requests-amp-json-in-windows-phone.aspx

    https://msdn.microsoft.com/pt-br/library/windows/apps/dn263219.aspx

    https://msdn.microsoft.com/pt-br/library/windows/apps/xaml/dn439314.aspx


    Matheus Leopardi Mello Canelada Campos

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    TechNet Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 2 de abril de 2015 02:42
  • Matheus,

    se trata de um aplicativo financeiro que funciona totalmente offline, exibindo gráficos e relatórios. No momento que o app tiver algum tipo de conexão em horários pré agendados é realizado um sincronismo da informação com um banco de dados que fica na nuvem.

    É possível administrar as finanças de vários devices e o sincronismo de fato é com um banco de dados na nuvem, mas preciso do banco local caso a pessoa esteja utilizando em algum local sem conexão com a internet.

    O app já existe na versão WP7 e comecei fazer para WP8, mas parei no meio do caminho porque eu resolvi fazer universal, logo comecei a versão 8.1 e esbarrei no quesito banco de dados.

    Sei que posso gravar Json localmente, posso gravar objetos complexos e etc, mas pelo volume de dados ficaria lento o acesso ao disco do aparelho.

    imagina pegar um Json do disco e transforma-lo em um objeto, onde tivesse pelo menos 100 mill registros.

    Sei o Sqlite seria o mais indicado, porém trabalhar com datas nele é horrível demais, por isso criei o post.

    Como não achei uma solução, voltei a tocar o projeto na versão WP8, mas ficaria feliz em resolver este problema.

    O ideal era criar um banco com linq to sql


    Paulo Rogerio

    quinta-feira, 2 de abril de 2015 03:46
  • Matheus, 
    acho que você não entendeu a pergunta e nunca usou SqLite, pois o link que você mandou faz consultas com datas para sql server. Sqlite trabalha de forma diferente, bem diferente por sinal.

    Antes de propor como resposta procure entender melhor o problema.

    Outro ponto que talvez você não tenha entendido, está é uma aplicação mobile.

    Para entender melhor o problema é o seguinte:

    se trata de um aplicativo financeiro que funciona totalmente offline, exibindo gráficos e relatórios. No momento que o app tiver algum tipo de conexão em horários pré agendados é realizado um sincronismo da informação com um banco de dados que fica na nuvem.

    É possível administrar as finanças de vários devices e o sincronismo de fato é com um banco de dados na nuvem, mas preciso do banco local caso a pessoa esteja utilizando em algum local sem conexão com a internet.

    O app já existe na versão WP7 e comecei fazer para WP8, mas parei no meio do caminho porque eu resolvi fazer universal, logo comecei a versão 8.1 e esbarrei no quesito banco de dados.

    Sei que posso gravar Json localmente, posso gravar objetos complexos e etc, mas pelo volume de dados ficaria lento o acesso ao disco do aparelho.

    imagina pegar um Json do disco e transforma-lo em um objeto, onde tivesse pelo menos 100 mill registros.

    Sei o Sqlite seria o mais indicado, porém trabalhar com datas nele é horrível demais, por isso criei o post.

    Como não achei uma solução, voltei a tocar o projeto na versão WP8, mas ficaria feliz em resolver este problema.

    O ideal era criar um banco com linq to sql



    Paulo Rogerio

    quinta-feira, 2 de abril de 2015 03:55
  • Bom dia Paulo,

    Entendi sua pergunta e não postei nada referente a Data do SQlitle mais sim de SQL para justamente ver a diferença sobre os dois e para você analisar o que é mais valido para seu desenvolvimento.

    Referente ao meu uso de SQLlitle utilizei em varias aplicações para algumas plataformas mobile. A minha ideia em postar o link era para auxiliar na decisão de qual usar.

    E por se tratar de thread bem próximas da igualdade estarei fechando essa thread e deixando aberta sua duvida na thread abaixo.

    https://social.msdn.microsoft.com/Forums/pt-BR/dab3c0f6-1b74-48e7-bc3e-7fb2f43ab18d/linq-to-sql-em-app-universal-wp81-win81?forum=winphone7pt

    Abraços


    Matheus Leopardi Mello Canelada Campos

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    TechNet Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.

    quinta-feira, 2 de abril de 2015 14:24
  • Infelizmente não conseguiu me ajudar, pois deixei bem claro que o problema é referente a buscar informações em cima de datas no Sqlite.

    Normalmente é utilizado o comando strftime

    Quando queremos fazer uma busca em cima de um mes ou ano por exemplo esse é o comando usado, eu não quero buscar utilizando between

    também deixo claro que o Sqlite para WP não da suporte a expressões lambda, só expressões bobinhas que da pra usar.

    Tenta pesquisar diretamente pelo mês usando expressão lambda que tomará um erro.

    Bom fico no aguardo de uma resposta de quem puder ajudar!


    Paulo Rogerio

    sexta-feira, 3 de abril de 2015 01:47