Apresentação sobre as funcionalidades de acesso a dados na nova versão do Windows Phone 7, conhecida por "Mango", que fiz no evento WP7 "Mango" Dev Hub.
Código-fonte das demonstrações:
https://github.com/augustoproiete/WP7MangoDevHub2011-DataAccess
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)
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
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
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
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
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
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();
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
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
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)
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