SlideShare uma empresa Scribd logo
1 de 51
Funcionalidades de Acesso a Dados no ‘Mango’ CaioProiete Formador @ CicloFormação Organizador @ ComunidadeNetPonto
CaioProiete +10 anos de experiênciaprofissionalem TI Consultor da Novabase Formador da Ciclo Líder da comunidadeNetPonto Microsoft MVP, MCT @CaioProiete http://caioproiete.net
PrincipaisNovidades SQL CE DB Criação e utilização de bases de dados (!) Consultasaoscontactos e compromissos Consultas a serviçosOData (Open Data Protocol)
LINQ to Everything LINQ Objects XML 7
LINQ to Everything LINQ Objects XML SQL User Data OData 7 Mango
Agenda LINQ to SQL LINQ to User Data VisãoGeral Arquitectura Desenvolvimento “Code-first” Detalhes de Implementação Consultas Inserir,alterar,e apagarregistos Actualizaçõesna base de dados Performance e boas práticas VisãoGeral Consentimento do utilizador Tipos de contassuporsuportados Detalhes de Implementação Consultasaoscontactos Consultasaoscompromissos Performance e boas práticas
EstruturaComplexa Diversosrelacionamentos e restrições Exemplo: Shopping List 7 tabelas 5 chavesestrangeiras Algumascentenas de registos
Dados de Referência Grandesquantidades de informaçãoestática Exemplo: dicionário, tradutor 3 tabelas 1 tabela com 500 mil registos
Web Service Cache Cloud Service Obtém as informaçõesatravés de um serviçonacloud Guardaos dados localmenteparaconsultaoff-line Combina com dados específicos do utilizador Windows Phone Service Cache User Data
Dados do Utilizador FiltrarContactos Aniversários no próximomês ConsultartodososCompromissos Encontrar data/horadisponívelparaumareunião Filtro
Demonstração Mobile Wine Cellar Permitegerirsuacolecção de vinhos no telefone Obtém dados do site wine.com via serviçoOData Guardainformações do utilizadorem base de dados local Consultacontactos e compromissosaoplanearprova de vinhos
Base de Dados
Armazenamento Local de Dados Aplicaçõesguardamdados privados no Isolated Storage ,[object Object]
Dados nãoestruturadosemficheiros
Dados estruturadosem bases de dadosPasta Raiz da Aplicação Install Package Manager Cria pasta raiz isoladapara a aplicação Pasta de Dados da Aplicação Cria/Manipula ficheiros e definições Aplicação WP7 Isolated Storage APIs Application Settings File Application Files
Armazenamento Local de Dados Aplicaçõesguardamdados privados no Isolated Storage ,[object Object]
Dados nãoestruturadosemficheiros
Dados estruturadosem bases de dadosPasta Raiz da Aplicação Install Package Manager Cria pasta raiz isoladapara a aplicação Pasta de Dados da Aplicação Cria/Manipula ficheiros e definições Aplicação WP7 Isolated Storage APIs DB Application Settings File Application Files Database file
Armazenamento Local de Dados Aplicaçõesguardamdados privados no Isolated Storage ,[object Object]
Dados nãoestruturadosemficheiros
Dados estruturadosem bases de dadosPasta Raiz da Aplicação Install Package Manager Cria pasta raiz isoladapara a aplicação DB Database File (read-only) Pasta de Dados da Aplicação Cria/Manipula ficheiros e definições Aplicação WP7 Isolated Storage APIs DB Application Settings File Application Files Database file
Base de Dados Local Base de dados não é partilhadaentre aplicações. Cadaaplicaçãoacedesomente as suaspróprias BDs Tamanhomáximo de cada base de dados = 512 MB Não é possívelexecutarconsultas T-SQL. Acessoaos dados apenas via LINQ to SQL
Arquitectura
Arquitectura SuaAplicação Data Context Objectos var query = fromw indb.Wines wherew.Country== "Portugal" selectw.Name;
Arquitectura SuaAplicação Data Context Objectos var query = fromw indb.Wines wherew.Country== "Portugal" selectw.Name; System.Data.Linq Identity Management Change Tracking Update Processing Object Materialization .Call System.Linq.Queryable.Select( .Call System.Linq.Queryable.Where( .Constant(Table(Wines)), '(.Lambda #Lambda1)), '(.Lambda #Lambda2)) .Lambda #Lambda1(db.Wines $w) { $w.Country== "Portugal" } .Lambda #Lambda2(w.Country $w) { $w.Name}
Arquitectura SuaAplicação Data Context Objectos var query = fromw indb.Wines wherew.Country== "Portugal" selectw.Name; System.Data.Linq Identity Management Change Tracking Update Processing Object Materialization .Call System.Linq.Queryable.Select( .Call System.Linq.Queryable.Where( .Constant(Table(Wines)), '(.Lambda #Lambda1)), '(.Lambda #Lambda2)) .Lambda #Lambda1(db.Wines $w) { $w.Country== "Portugal" } .Lambda #Lambda2(w.Country $w) { $w.Name} select Name from Wines where Country = "Portugal" Microsoft.Phone.Data.Internal  Core ADO.NET (System.Data) SQL CE DB SQLCE ADO.NET Provider (System.Data.SqlServerCe)
Desenvolvimento “Code First”
Desenvolvimento “Code First” Design time ,[object Object]
Decorar as classes com osatributosparapersistência dos dadosVarietals Wines Vineyards
Desenvolvimento “Code First” Design time ,[object Object]
Decorar as classes com osatributosparapersistência dos dadosVarietals Wines Vineyards ,[object Object]
Transformarmodelo de classes no ficheiro da base de dados
Persistir as alteraçõesna base de dados através da APIRun time
Desenvolvimento “Code First” Design time ,[object Object]
Decorar as classes com osatributosparapersistência dos dadosVarietals Wines Vineyards WineMakers ,[object Object]
Transformarmodelo de classes no ficheiro da base de dados
Persistir as alteraçõesna base de dados através da APIRun time Database upgrade ,[object Object]
Utilizar APIs de actualizaçãoparaalterar a base de dados,[object Object]
Consultaaos Dados: Exemplo // Criaumainstância do DataContextpara a BD definidana string de conexão DataContextdb = newWineDataContext("isostore:/WineDB.sdf"); // Obtémtodososvinhos da variedade “Merlot” existentes no stock de casa,  // ordenadospela data de aquisição varq = from w indb.Wines 	  wherew.Varietal.Name == "Merlot" && w.IsAtHome == true orderbyw.DateAcquired 	  select w;
Inserts/Updates/Deletes Código da suaAplicação Efectuadosatravés do DataContext Alteraçõessãoefectuadasprimeiro no DataContext (emmemória) e sódepoisgravadasna base de dados via SubmitChanges() SubmitChanges O LINQ to SQL verifica o quefoialteradoactualiza a base de dados DataContext DB
Inserts/Updates/Deletes Update Insert WinenewWine= newWine { WineID = 1768, Name = "Windows Phone Syrah", Description = "Bold and spicy" }; db.Wines.InsertOnSubmit(newWine); db.SubmitChanges(); Winewine=  (fromw indb.Wines  wherew.WineID == 1768 select w).First(); wine.Description= "Hints of plum and melon"; db.SubmitChanges();
Inserts/Updates/Deletes Delete varvineyardsToDelete=  fromVineyards v in db.Vineyards wherev.Country== "Spain" select v; db.Vineyards.DeleteAllOnSubmit (vineyardsToDelete); db.SubmitChanges();
Inserts/Updates/Deletes Delete varvineyardsToDelete=  fromVineyards v in db.Vineyards wherev.Country== "Spain" select v; db.Vineyards.DeleteAllOnSubmit (vineyardsToDelete); db.SubmitChanges(); Podeocorrerumaexcepçãoaqui se osvinhosassociadosnãoforemapagadosprimeiro (foreign key constraint)
Inserts/Updates/Deletes Delete varvineyardsToDelete= fromVineyards v indb.Vineyards 			wherev.Country== "Spain" select v; foreach (Vineyards v invineyardsToDelete) { db.Wines.DeleteAllOnSubmit(v.Wines); } db.Vineyards.DeleteAllOnSubmit(vineyardsToDelete); db.SubmitChanges();
Demonstração Base de Dados Criar base de dados Consultar, inserir, alterar e apagarregistos Utilizarconsultascompiladas Código-fontedisponívelem: https://github.com/CaioProiete/WP7MangoDevHub2011-DataAccess
ActualizaçõesnaEstrutura da BD O DatabaseSchemaUpdaterpermiteefectuaroperações simples de actualizaçãonaestrutura de bases de dadosPermiteadicionar Tabelas Colunas Índices Associações/chavesestrangeiras Actualizaçõesnaestruturasãotransacionais Para actualizaçõesmaiscomplexas é precisoefectuar a migração total da base de dados
ActualizaçõesnaEstrutura da BD Criauma nova instância do DatabaseSchemaUpdaterWineDataContextdbContext = newWineDataContext("isostore:/WineDB.sdf");DatabaseSchemaUpdaterdbUpdater = dbContext.CreateDatabaseSchemaUpdater(); Adicionauma nova tabelaassociada a classeWinemakerdbUpdater.AddTable<Winemaker>(); Adiciona a colunaYearEstabilishednatabelaVineyarddbUpdater.AddColumn<Vineyard>("YearEstablished"); Executa as actualizaçõesnaestrutura dbUpdater.Execute();
Demonstração Base de Dados Alteração da estrutura da base de dados Código-fontedisponívelem: https://github.com/CaioProiete/WP7MangoDevHub2011-DataAccess
Performance e Boas Práticas Nãoacumulemuitasalteraçõesemmemória Grave as alteraçõesna BD (SubmitChanges) com frequênciaparaevitarperda de dados no término da aplicação Utilize background threads Operaçõesmaisdemoradasna BD nãodevembloquear a thread da interface com o utilizador Optimize consultasread-only Desligue o Object Trackingparaeconomizarmemória Utilize índicesparapropriedadesmuitoutilizadasemconsultas
Performance e Boas Práticas Incluatabelas com dados jácarregados, se possível Crie um projectoparacarregaros dados no emulador Extraia o ficheiro .SDF com o Isolated Storage Explorer Quandoutilizar bases de dados… Prepare-se paraaumento no tempo de inicialização da aplicação e nautilização da memória Use IsolatedStorageSettingsouficheiros simples paraconjuntos de dados empequenaquantidade
Dados do Utilizador

Mais conteúdo relacionado

Semelhante a Funcionalidades de Acesso a Dados no 'Mango'

Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
Rodrigo Kono
 
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
iMasters
 

Semelhante a Funcionalidades de Acesso a Dados no 'Mango' (20)

MongoDB + PHP
MongoDB + PHPMongoDB + PHP
MongoDB + PHP
 
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
Faça Sucesso Desenvolvendo com ASP.NET 4, ASP NET MVC e Visual Studio 2010
 
Aplicações de tempo real com Meteor.js
Aplicações de tempo real com Meteor.jsAplicações de tempo real com Meteor.js
Aplicações de tempo real com Meteor.js
 
Economize o Consumo de Link WAN com o BranchCache
Economize o Consumo de Link WAN com o BranchCacheEconomize o Consumo de Link WAN com o BranchCache
Economize o Consumo de Link WAN com o BranchCache
 
Java 16 Jdbc
Java 16 JdbcJava 16 Jdbc
Java 16 Jdbc
 
Desenvolvimento web com vs2012: Uma visão geral
Desenvolvimento web com vs2012: Uma visão geralDesenvolvimento web com vs2012: Uma visão geral
Desenvolvimento web com vs2012: Uma visão geral
 
Comparacao Estrategica sobre as Tecnologias de Acesso a Dados da Microsoft
Comparacao Estrategica sobre as Tecnologias de Acesso a Dados da MicrosoftComparacao Estrategica sobre as Tecnologias de Acesso a Dados da Microsoft
Comparacao Estrategica sobre as Tecnologias de Acesso a Dados da Microsoft
 
What's New On Azure IaaS
What's New On Azure IaaSWhat's New On Azure IaaS
What's New On Azure IaaS
 
Big Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenhoBig Data como Serviço: da captura à visualização de dados com alto desempenho
Big Data como Serviço: da captura à visualização de dados com alto desempenho
 
20140520 Microsoft WebCamp - DataBinding with KnockoutJS
20140520 Microsoft WebCamp - DataBinding with KnockoutJS20140520 Microsoft WebCamp - DataBinding with KnockoutJS
20140520 Microsoft WebCamp - DataBinding with KnockoutJS
 
Quebrando o monolito com microserviços - TDC 2017
Quebrando o monolito com microserviços - TDC 2017Quebrando o monolito com microserviços - TDC 2017
Quebrando o monolito com microserviços - TDC 2017
 
Monitorando os Recursos e Processos do Servidor, através do Power BI
Monitorando os Recursos e Processos do Servidor, através do Power BIMonitorando os Recursos e Processos do Servidor, através do Power BI
Monitorando os Recursos e Processos do Servidor, através do Power BI
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Oficial
OficialOficial
Oficial
 
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
Datawarehouse - Obtenha insights consistentes para o seu negócio: conheça o n...
 
Visão Geral De Desenvolvimento Web Sre 2012
Visão Geral De Desenvolvimento Web   Sre 2012Visão Geral De Desenvolvimento Web   Sre 2012
Visão Geral De Desenvolvimento Web Sre 2012
 
Apache Wicket
Apache WicketApache Wicket
Apache Wicket
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
Aula1
Aula1Aula1
Aula1
 

Mais de C. Augusto Proiete

Mais de C. Augusto Proiete (19)

Developing Windows 8 Apps with HTML and JavaScript - Codebits 2012
Developing Windows 8 Apps with HTML and JavaScript - Codebits 2012Developing Windows 8 Apps with HTML and JavaScript - Codebits 2012
Developing Windows 8 Apps with HTML and JavaScript - Codebits 2012
 
Windows 8: Desenvolvimento de Metro Style Apps
Windows 8: Desenvolvimento de Metro Style AppsWindows 8: Desenvolvimento de Metro Style Apps
Windows 8: Desenvolvimento de Metro Style Apps
 
Windows Workflow Foundation 4: Introdução
Windows Workflow Foundation 4: IntroduçãoWindows Workflow Foundation 4: Introdução
Windows Workflow Foundation 4: Introdução
 
Reporting Services 2008 R2: Novidades
Reporting Services 2008 R2: NovidadesReporting Services 2008 R2: Novidades
Reporting Services 2008 R2: Novidades
 
Microsoft MVP 2011 ERL - C. Augusto Proiete
Microsoft MVP 2011 ERL - C. Augusto ProieteMicrosoft MVP 2011 ERL - C. Augusto Proiete
Microsoft MVP 2011 ERL - C. Augusto Proiete
 
Microsoft Transcript Report - C. Augusto Proiete
Microsoft Transcript Report - C. Augusto ProieteMicrosoft Transcript Report - C. Augusto Proiete
Microsoft Transcript Report - C. Augusto Proiete
 
Novidades do ASP .NET MVC 3
Novidades do ASP .NET MVC 3Novidades do ASP .NET MVC 3
Novidades do ASP .NET MVC 3
 
Controlo de Versões Distribuído com Git
Controlo de Versões Distribuído com GitControlo de Versões Distribuído com Git
Controlo de Versões Distribuído com Git
 
Novidades ASP .NET MVC 3 (BETA)
Novidades ASP .NET MVC 3 (BETA)Novidades ASP .NET MVC 3 (BETA)
Novidades ASP .NET MVC 3 (BETA)
 
Inversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET FrameworkInversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET Framework
 
ASP .NET 4.0 WebForms, Novas funcionalidades
ASP .NET 4.0 WebForms, Novas funcionalidadesASP .NET 4.0 WebForms, Novas funcionalidades
ASP .NET 4.0 WebForms, Novas funcionalidades
 
Entity Framework 4, Novas funcionalidades
Entity Framework 4, Novas funcionalidadesEntity Framework 4, Novas funcionalidades
Entity Framework 4, Novas funcionalidades
 
Novidades do CSharp 4.0
Novidades do CSharp 4.0Novidades do CSharp 4.0
Novidades do CSharp 4.0
 
Novidades do Visual Basic .NET 10
Novidades do Visual Basic .NET 10Novidades do Visual Basic .NET 10
Novidades do Visual Basic .NET 10
 
Nova Geração de Certificações Microsoft Visual Studio 2008 e Visual Studio 2010
Nova Geração de Certificações Microsoft Visual Studio 2008 e Visual Studio 2010Nova Geração de Certificações Microsoft Visual Studio 2008 e Visual Studio 2010
Nova Geração de Certificações Microsoft Visual Studio 2008 e Visual Studio 2010
 
Introdução ao WCF - Windows Communication Foundation
Introdução ao WCF - Windows Communication FoundationIntrodução ao WCF - Windows Communication Foundation
Introdução ao WCF - Windows Communication Foundation
 
ASP .NET MVC na Prática
ASP .NET MVC na PráticaASP .NET MVC na Prática
ASP .NET MVC na Prática
 
Introdução ao ASP .NET MVC
Introdução ao ASP .NET MVCIntrodução ao ASP .NET MVC
Introdução ao ASP .NET MVC
 
Apresentação da Comunidade NetPonto
Apresentação da Comunidade NetPontoApresentação da Comunidade NetPonto
Apresentação da Comunidade NetPonto
 

Funcionalidades de Acesso a Dados no 'Mango'

  • 1. Funcionalidades de Acesso a Dados no ‘Mango’ CaioProiete Formador @ CicloFormação Organizador @ ComunidadeNetPonto
  • 2. CaioProiete +10 anos de experiênciaprofissionalem TI Consultor da Novabase Formador da Ciclo Líder da comunidadeNetPonto Microsoft MVP, MCT @CaioProiete http://caioproiete.net
  • 3. PrincipaisNovidades SQL CE DB Criação e utilização de bases de dados (!) Consultasaoscontactos e compromissos Consultas a serviçosOData (Open Data Protocol)
  • 4. LINQ to Everything LINQ Objects XML 7
  • 5. LINQ to Everything LINQ Objects XML SQL User Data OData 7 Mango
  • 6. Agenda LINQ to SQL LINQ to User Data VisãoGeral Arquitectura Desenvolvimento “Code-first” Detalhes de Implementação Consultas Inserir,alterar,e apagarregistos Actualizaçõesna base de dados Performance e boas práticas VisãoGeral Consentimento do utilizador Tipos de contassuporsuportados Detalhes de Implementação Consultasaoscontactos Consultasaoscompromissos Performance e boas práticas
  • 7. EstruturaComplexa Diversosrelacionamentos e restrições Exemplo: Shopping List 7 tabelas 5 chavesestrangeiras Algumascentenas de registos
  • 8. Dados de Referência Grandesquantidades de informaçãoestática Exemplo: dicionário, tradutor 3 tabelas 1 tabela com 500 mil registos
  • 9. Web Service Cache Cloud Service Obtém as informaçõesatravés de um serviçonacloud Guardaos dados localmenteparaconsultaoff-line Combina com dados específicos do utilizador Windows Phone Service Cache User Data
  • 10. Dados do Utilizador FiltrarContactos Aniversários no próximomês ConsultartodososCompromissos Encontrar data/horadisponívelparaumareunião Filtro
  • 11. Demonstração Mobile Wine Cellar Permitegerirsuacolecção de vinhos no telefone Obtém dados do site wine.com via serviçoOData Guardainformações do utilizadorem base de dados local Consultacontactos e compromissosaoplanearprova de vinhos
  • 13.
  • 15. Dados estruturadosem bases de dadosPasta Raiz da Aplicação Install Package Manager Cria pasta raiz isoladapara a aplicação Pasta de Dados da Aplicação Cria/Manipula ficheiros e definições Aplicação WP7 Isolated Storage APIs Application Settings File Application Files
  • 16.
  • 18. Dados estruturadosem bases de dadosPasta Raiz da Aplicação Install Package Manager Cria pasta raiz isoladapara a aplicação Pasta de Dados da Aplicação Cria/Manipula ficheiros e definições Aplicação WP7 Isolated Storage APIs DB Application Settings File Application Files Database file
  • 19.
  • 21. Dados estruturadosem bases de dadosPasta Raiz da Aplicação Install Package Manager Cria pasta raiz isoladapara a aplicação DB Database File (read-only) Pasta de Dados da Aplicação Cria/Manipula ficheiros e definições Aplicação WP7 Isolated Storage APIs DB Application Settings File Application Files Database file
  • 22. Base de Dados Local Base de dados não é partilhadaentre aplicações. Cadaaplicaçãoacedesomente as suaspróprias BDs Tamanhomáximo de cada base de dados = 512 MB Não é possívelexecutarconsultas T-SQL. Acessoaos dados apenas via LINQ to SQL
  • 24. Arquitectura SuaAplicação Data Context Objectos var query = fromw indb.Wines wherew.Country== "Portugal" selectw.Name;
  • 25. Arquitectura SuaAplicação Data Context Objectos var query = fromw indb.Wines wherew.Country== "Portugal" selectw.Name; System.Data.Linq Identity Management Change Tracking Update Processing Object Materialization .Call System.Linq.Queryable.Select( .Call System.Linq.Queryable.Where( .Constant(Table(Wines)), '(.Lambda #Lambda1)), '(.Lambda #Lambda2)) .Lambda #Lambda1(db.Wines $w) { $w.Country== "Portugal" } .Lambda #Lambda2(w.Country $w) { $w.Name}
  • 26. Arquitectura SuaAplicação Data Context Objectos var query = fromw indb.Wines wherew.Country== "Portugal" selectw.Name; System.Data.Linq Identity Management Change Tracking Update Processing Object Materialization .Call System.Linq.Queryable.Select( .Call System.Linq.Queryable.Where( .Constant(Table(Wines)), '(.Lambda #Lambda1)), '(.Lambda #Lambda2)) .Lambda #Lambda1(db.Wines $w) { $w.Country== "Portugal" } .Lambda #Lambda2(w.Country $w) { $w.Name} select Name from Wines where Country = "Portugal" Microsoft.Phone.Data.Internal Core ADO.NET (System.Data) SQL CE DB SQLCE ADO.NET Provider (System.Data.SqlServerCe)
  • 28.
  • 29. Decorar as classes com osatributosparapersistência dos dadosVarietals Wines Vineyards
  • 30.
  • 31.
  • 32. Transformarmodelo de classes no ficheiro da base de dados
  • 33. Persistir as alteraçõesna base de dados através da APIRun time
  • 34.
  • 35.
  • 36. Transformarmodelo de classes no ficheiro da base de dados
  • 37.
  • 38.
  • 39. Consultaaos Dados: Exemplo // Criaumainstância do DataContextpara a BD definidana string de conexão DataContextdb = newWineDataContext("isostore:/WineDB.sdf"); // Obtémtodososvinhos da variedade “Merlot” existentes no stock de casa, // ordenadospela data de aquisição varq = from w indb.Wines wherew.Varietal.Name == "Merlot" && w.IsAtHome == true orderbyw.DateAcquired select w;
  • 40. Inserts/Updates/Deletes Código da suaAplicação Efectuadosatravés do DataContext Alteraçõessãoefectuadasprimeiro no DataContext (emmemória) e sódepoisgravadasna base de dados via SubmitChanges() SubmitChanges O LINQ to SQL verifica o quefoialteradoactualiza a base de dados DataContext DB
  • 41. Inserts/Updates/Deletes Update Insert WinenewWine= newWine { WineID = 1768, Name = "Windows Phone Syrah", Description = "Bold and spicy" }; db.Wines.InsertOnSubmit(newWine); db.SubmitChanges(); Winewine= (fromw indb.Wines wherew.WineID == 1768 select w).First(); wine.Description= "Hints of plum and melon"; db.SubmitChanges();
  • 42. Inserts/Updates/Deletes Delete varvineyardsToDelete= fromVineyards v in db.Vineyards wherev.Country== "Spain" select v; db.Vineyards.DeleteAllOnSubmit (vineyardsToDelete); db.SubmitChanges();
  • 43. Inserts/Updates/Deletes Delete varvineyardsToDelete= fromVineyards v in db.Vineyards wherev.Country== "Spain" select v; db.Vineyards.DeleteAllOnSubmit (vineyardsToDelete); db.SubmitChanges(); Podeocorrerumaexcepçãoaqui se osvinhosassociadosnãoforemapagadosprimeiro (foreign key constraint)
  • 44. Inserts/Updates/Deletes Delete varvineyardsToDelete= fromVineyards v indb.Vineyards wherev.Country== "Spain" select v; foreach (Vineyards v invineyardsToDelete) { db.Wines.DeleteAllOnSubmit(v.Wines); } db.Vineyards.DeleteAllOnSubmit(vineyardsToDelete); db.SubmitChanges();
  • 45. Demonstração Base de Dados Criar base de dados Consultar, inserir, alterar e apagarregistos Utilizarconsultascompiladas Código-fontedisponívelem: https://github.com/CaioProiete/WP7MangoDevHub2011-DataAccess
  • 46. ActualizaçõesnaEstrutura da BD O DatabaseSchemaUpdaterpermiteefectuaroperações simples de actualizaçãonaestrutura de bases de dadosPermiteadicionar Tabelas Colunas Índices Associações/chavesestrangeiras Actualizaçõesnaestruturasãotransacionais Para actualizaçõesmaiscomplexas é precisoefectuar a migração total da base de dados
  • 47. ActualizaçõesnaEstrutura da BD Criauma nova instância do DatabaseSchemaUpdaterWineDataContextdbContext = newWineDataContext("isostore:/WineDB.sdf");DatabaseSchemaUpdaterdbUpdater = dbContext.CreateDatabaseSchemaUpdater(); Adicionauma nova tabelaassociada a classeWinemakerdbUpdater.AddTable<Winemaker>(); Adiciona a colunaYearEstabilishednatabelaVineyarddbUpdater.AddColumn<Vineyard>("YearEstablished"); Executa as actualizaçõesnaestrutura dbUpdater.Execute();
  • 48. Demonstração Base de Dados Alteração da estrutura da base de dados Código-fontedisponívelem: https://github.com/CaioProiete/WP7MangoDevHub2011-DataAccess
  • 49. Performance e Boas Práticas Nãoacumulemuitasalteraçõesemmemória Grave as alteraçõesna BD (SubmitChanges) com frequênciaparaevitarperda de dados no término da aplicação Utilize background threads Operaçõesmaisdemoradasna BD nãodevembloquear a thread da interface com o utilizador Optimize consultasread-only Desligue o Object Trackingparaeconomizarmemória Utilize índicesparapropriedadesmuitoutilizadasemconsultas
  • 50. Performance e Boas Práticas Incluatabelas com dados jácarregados, se possível Crie um projectoparacarregaros dados no emulador Extraia o ficheiro .SDF com o Isolated Storage Explorer Quandoutilizar bases de dados… Prepare-se paraaumento no tempo de inicialização da aplicação e nautilização da memória Use IsolatedStorageSettingsouficheiros simples paraconjuntos de dados empequenaquantidade
  • 52. APIs Novas e Actualizadas no “Mango” Chooser Tasksrelacionadas com dados do utilizador EmailAddressChooserTask PhoneNumberChooserTask AddressChooserTask Microsoft.Phone.UserDataparaacessodirecto Contacts Appointments
  • 53. AddressChooserTask privateAddressChooserTaskaddressChooserTask; // Constructor publicMainPage() { this.addressChooserTask= newAddressChooserTask(); this.addressChooserTask.Completed+= addressChooserTask_Completed; this.addressChooserTask.Show(); } privatevoidaddressChooserTask_Completed(objectsender, AddressResulte) { if(null == e.Error && TaskResult.OK == e.TaskResult) { ... = e.DisplayName; ... = e.Address; } }
  • 54. Microsoft.Phone.UserData Importante As APIs de Contactos e Compromissossãoread-only Não é possívelaceder dados de redessociaisquenãosão da Microsoft* * Com excepção do Facebook
  • 56. Contactos: Olá, Mundo! Contactscontacts = newContacts(); contacts.SearchCompleted+= newEventHandler<ContactsSearchEventArgs>((sender, e) => { ...= e.Results; }); // Ex: Obtertodososcontactos contacts.SearchAsync(string.Empty, FilterKind.None, null);
  • 57. Contactos: Olá, Mundo! Contactscontacts = newContacts(); contacts.SearchCompleted+= newEventHandler<ContactsSearchEventArgs>((sender, e) => { ...= e.Results; }); // Ex: Obtertodososcontactos contacts.SearchAsync(string.Empty, FilterKind.None, null); Informações de estado expressão de filtro (não é regex) tipo de filtro: nome, email , telefoneoupinned to start)
  • 58. Contactos: Olá, Mundo! Contactscontacts = newContacts(); contacts.SearchCompleted+= newEventHandler<ContactsSearchEventArgs>((sender, e) => { ...= e.Results; }); // Ex: Obtertodososcontactos contacts.SearchAsync(string.Empty, FilterKind.None, null); Informações de estado // Ex: Procurarcontactos com "J" no nome contacts.SearchAsync("J", FilterKind.DisplayName, null); expressão de filtro (não é regex) tipo de filtro: nome, email , telefoneoupinned to start)
  • 59. Compromissos: Olá, Mundo! Appointmentsappointments = newAppointments(); appointments.SearchCompleted+= newEventHandler<AppointmentsSearchEventArgs>((sender, e) => { ... = e.Results; }); // Ex: Obter o próximocompromisso (de agora até 1 semana) appointments.SearchAsync(DateTime.Now, DateTime.Now+ TimeSpan.FromDays(7), 1, null);
  • 60. Compromissos: Olá, Mundo! Appointmentsappointments = newAppointments(); appointments.SearchCompleted+= newEventHandler<AppointmentsSearchEventArgs>((sender, e) => { ... = e.Results; }); // Ex: Obter o próximocompromisso (de agora até 1 semana) appointments.SearchAsync(DateTime.Now, DateTime.Now+ TimeSpan.FromDays(7), 1, null); Data e hora de início Data e hora de fim Númeromáximo de registos Informações de estado
  • 61. Demonstração Base de Dados AddressChooserTask ConsultaaosContactos ConsultaaosCompromissos Código-fontedisponívelem: https://github.com/CaioProiete/WP7MangoDevHub2011-DataAccess
  • 62. Performance e Boas Práticas Sejaresponsável A suapolítica de privacidadedeveindicarcomoutilizaoscontactos do utilizador Prepare a aplicação O tamanho da lista de contactosvariaparacadautilizador A aplicaçãodeve saber lidar com atrasosnasconsultas Eviteutilizar dados desactualizados Dados retornadossãoumacópia Repita a consultaquandoapropriado
  • 64. Obrigado! Caio Proiete caio@netponto.org http://caioproiete.net http://twitter.com/caioproiete