Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Funcionalidades de Acesso a Dados no 'Mango'

Funcionalidades de Acesso a Dados no 'Mango'

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/CaioProiete/WP7MangoDevHub2011-DataAccess

C. Augusto Proiete

May 13, 2012
Tweet

More Decks by C. Augusto Proiete

Other Decks in Programming

Transcript

  1. Funcionalidades de Acesso a Dados no ‘Mango’ Caio Proiete Formador

    @ Ciclo Formação Organizador @ Comunidade NetPonto
  2. Caio Proiete  +10 anos de experiência profissional em TI

     Consultor da Novabase ( http://novabase.pt )  Formador da CICLO ( http://ciclo.pt )  Líder da comunidade NetPonto ( http://netponto.org )  Microsoft MVP , MCT @CaioProiete http://caioproiete.net
  3. Principais Novidades SQL CE DB Criação e utilização de bases

    de dados (!) Consultas a serviços OData (Open Data Protocol) Consultas aos contactos e compromissos
  4. Agenda LINQ to SQL  Visão Geral  Arquitectura 

    Desenvolvimento “Code-first”  Detalhes de Implementação  Consultas  Inserir, alterar, e apagar registos  Actualizações na base de dados  Performance e boas práticas LINQ to User Data  Visão Geral  Consentimento do utilizador  Tipos de contas supor suportados  Detalhes de Implementação  Consultas aos contactos  Consultas aos compromissos  Performance e boas práticas
  5. Estrutura Complexa  Diversos relacionamentos e restrições  Exemplo: Shopping

    List  7 tabelas  5 chaves estrangeiras  Algumas centenas de registos ItemReferenceData PK ItemId ItemName ItemDescription FK1 CategoryId Categories PK CategoryId CategoryName Lists PK ListId ListName ListItems PK ListItemId ListItemName FK1 ListId Quantity Category Description FK2 StoreId Stores PK StoreId StoreName StoreLocationLat StoreLocationLong StoreAddressLine1 StoreAddressLine2 StoreAddressCity StoreAddressState StoreAddressCountry StoryAddressZip Favorites PK FavoriteItemId FavoriteItemName FavoriteItemCategory FavoriteItemQuantity FavoriteItemDescription FK1 FavoriteItemListId FavoriteItemPhoto History PK HistoryItemId HistoryItemName HistoryItemCategory HistoryItemQuantity HistoryItemDescriptioin HistoryItemDateAdded FK1 HistoryItemListId HistoryItemPhoto
  6. Dados de Referência  Grandes quantidades de informação estática 

    Exemplo: dicionário, tradutor  3 tabelas  1 tabela com 500 mil registos Words PK WordId Word Pronunciation Definition AlternateSpellings Origin Favorites PK FavoriteId FK1 WordId History PK HistoryItemId FK1 WordId AddedDate
  7. Web Service Cache  Obtém as informações através de um

    serviço na cloud  Guarda os dados localmente para consulta off-line  Combina com dados específicos do utilizador Windows Phone
  8. Dados do Utilizador  Filtrar Contactos  Aniversários no próximo

    mês  Consultar todos os Compromissos  Encontrar data/hora disponível para uma reunião Filtro
  9. Armazenamento Local de Dados Aplicações guardam dados privados no Isolated

    Storage  Definições e propriedades no dicionário  Dados não estruturados em ficheiros  Dados estruturados em bases de dados Application Settings File Aplicação Cria/Manipula ficheiros e definições Application Files Pasta de Dados da Aplicação Cria pasta raiz isolada para a aplicação Package Manager Pasta Raiz da Aplicação WP7 Isolated Storage APIs Install
  10. Armazenamento Local de Dados Aplicações guardam dados privados no Isolated

    Storage  Definições e propriedades no dicionário  Dados não estruturados em ficheiros  Dados estruturados em bases de dados Application Settings File Aplicação Cria/Manipula ficheiros e definições Application Files Pasta de Dados da Aplicação Cria pasta raiz isolada para a aplicação Package Manager Pasta Raiz da Aplicação WP7 Isolated Storage APIs Install DB Database file
  11. Armazenamento Local de Dados Aplicações guardam dados privados no Isolated

    Storage  Definições e propriedades no dicionário  Dados não estruturados em ficheiros  Dados estruturados em bases de dados Application Settings File Aplicação Cria/Manipula ficheiros e definições Application Files Pasta de Dados da Aplicação Cria pasta raiz isolada para a aplicação Package Manager Pasta Raiz da Aplicação WP7 Isolated Storage APIs Install DB Database file DB Database File (read-only)
  12. Base de Dados Local  Base de dados não é

    partilhada entre aplicações. Cada aplicação acede somente as suas próprias BDs  Tamanho máximo de cada base de dados = 512 MB  Não é possível executar consultas T-SQL. Acesso aos dados apenas via LINQ to SQL
  13. Arquitectura Data Context Objectos var query = from w in

    db.Wines where w.Country == "Portugal" select w.Name;
  14. Arquitectura Data Context Objectos 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 } var query = from w in db.Wines where w.Country == "Portugal" select w.Name;
  15. Arquitectura Data Context Objectos Identity Management Change Tracking Update Processing

    Object Materialization Core ADO.NET (System.Data) SQLCE ADO.NET Provider (System.Data.SqlServerCe) SQL CE DB .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 } var query = from w in db.Wines where w.Country == "Portugal" select w.Name; select Name from Wines where Country = "Portugal"
  16. Desenvolvimento “Code First” Design time  Criar o modelo de

    classes: wines, varietals, vineyards, etc.  Decorar as classes com os atributos para persistência dos dados Varietals Wines Vineyards
  17. Desenvolvimento “Code First” Design time  Criar o modelo de

    classes: wines, varietals, vineyards, etc.  Decorar as classes com os atributos para persistência dos dados Run time  Criar o DataContext referente a base de dados  Transformar modelo de classes no ficheiro da base de dados  Persistir as alterações na base de dados através da API Varietals Wines Vineyards Wines PK WineID Name Description RetailPrice FK2 VarietalID FK1 VineyardID Vineyards PK VineyardID Name Latitude Longitude Country Varietals PK VarietalID Name
  18. Desenvolvimento “Code First” Design time  Criar o modelo de

    classes: wines, varietals, vineyards, etc.  Decorar as classes com os atributos para persistência dos dados Run time  Criar o DataContext referente a base de dados  Transformar modelo de classes no ficheiro da base de dados  Persistir as alterações na base de dados através da API Database upgrade  Criar novas classes com as alterações  Utilizar APIs de actualização para alterar a base de dados Varietals Wines Vineyards WineMakers Wines PK WineID Name Description RetailPrice FK2 VarietalID FK1 VineyardID Vineyards PK VineyardID Name Latitude Longitude Country Varietals PK VarietalID Name Winemaker PK WinemakerID FirstName LastName
  19. Criação da Base de Dados: Exemplo // Define o DataContext.

    public partial class WineDataContext : DataContext { public Table<Wine> Wines; public Table<Vineyard> Vineyards; public WineDataContext(string connectionString) : base(connectionString) { } } // Define as tabelas da base de dados [Table] public class Wine { [Column(IsPrimaryKey=true] public string WineID { get; set; } [Column] public string Name { get; set; } …… } // Cria a base de dados no isolated storage, se não existir DataContext db = new WineDataContext("isostore:/WineDB.sdf"); if (!db.DatabaseExists()) db.CreateDatabase();
  20. Consulta aos Dados: Exemplo // Cria uma instância do DataContext

    para a BD definida na string de conexão DataContext db = new WineDataContext("isostore:/WineDB.sdf"); // Obtém todos os vinhos da variedade “Merlot” existentes no stock de casa, // ordenados pela data de aquisição var q = from w in db.Wines where w.Varietal.Name == "Merlot" && w.IsAtHome == true orderby w.DateAcquired select w;
  21. DB Name Little Penguin Varietal Pinot Noir AtHome False Name

    Little Penguin Varietal Pinot Noir AtHome True Inserts/Updates/Deletes  Efectuados através do DataContext  Alterações são efectuadas primeiro no DataContext (em memória) e só depois gravadas na base de dados via SubmitChanges()  SubmitChanges  O LINQ to SQL verifica o que foi alterado actualiza a base de dados Name Little Penguin Varietal Pinot Noir AtHome False Name Yellow Tail Varietal Pinot Noir AtHome True
  22. Inserts/Updates/Deletes Insert Update Wine newWine = new Wine { WineID

    = 1768, Name = "Windows Phone Syrah", Description = "Bold and spicy" }; db.Wines.InsertOnSubmit(newWine); db.SubmitChanges(); Wine wine = (from w in db.Wines where w.WineID == 1768 select w).First(); wine.Description = "Hints of plum and melon"; db.SubmitChanges();
  23. Inserts/Updates/Deletes Delete var vineyardsToDelete = from Vineyards v in db.Vineyards

    where v.Country == "Spain" select v; db.Vineyards.DeleteAllOnSubmit (vineyardsToDelete); db.SubmitChanges();
  24. Inserts/Updates/Deletes Delete var vineyardsToDelete = from Vineyards v in db.Vineyards

    where v.Country == "Spain" select v; db.Vineyards.DeleteAllOnSubmit (vineyardsToDelete); db.SubmitChanges();
  25. Inserts/Updates/Deletes var vineyardsToDelete = from Vineyards v in db.Vineyards where

    v.Country == "Spain" select v; foreach (Vineyards v in vineyardsToDelete) { db.Wines.DeleteAllOnSubmit(v.Wines); } db.Vineyards.DeleteAllOnSubmit(vineyardsToDelete); db.SubmitChanges(); Delete
  26. Demonstração Base de Dados  Criar base de dados 

    Consultar, inserir, alterar e apagar registos  Utilizar consultas compiladas Código-fonte disponível em: https://github.com/CaioProiete/WP7MangoDevHub2011-DataAccess
  27. Actualizações na Estrutura da BD  O DatabaseSchemaUpdater permite efectuar

    operações simples de actualização na estrutura de bases de dados Permite adicionar  Tabelas  Colunas  Índices  Associações/chaves estrangeiras  Actualizações na estrutura são transacionais  Para actualizações mais complexas é preciso efectuar a migração total da base de dados
  28.  Cria uma nova instância do DatabaseSchemaUpdater WineDataContext dbContext =

    new WineDataContext("isostore:/WineDB.sdf"); DatabaseSchemaUpdater dbUpdater = dbContext.CreateDatabaseSchemaUpdater();  Adiciona uma nova tabela associada a classe Winemaker dbUpdater.AddTable<Winemaker>();  Adiciona a coluna YearEstabilished na tabela Vineyard dbUpdater.AddColumn<Vineyard>("YearEstablished");  Executa as actualizações na estrutura dbUpdater.Execute(); Actualizações na Estrutura da BD
  29. Demonstração Base de Dados  Alteração da estrutura da base

    de dados Código-fonte disponível em: https://github.com/CaioProiete/WP7MangoDevHub2011-DataAccess
  30. Performance e Boas Práticas  Não acumule muitas alterações em

    memória  Grave as alterações na BD (SubmitChanges) com frequência para evitar perda de dados no término da aplicação  Utilize background threads  Operações mais demoradas na BD não devem bloquear a thread da interface com o utilizador  Optimize consultas read-only  Desligue o Object Tracking para economizar memória  Utilize índices para propriedades muito utilizadas em consultas
  31. Performance e Boas Práticas  Inclua tabelas com dados já

    carregados, se possível  Crie um projecto para carregar os dados no emulador  Extraia o ficheiro .SDF com o Isolated Storage Explorer  Quando utilizar bases de dados…  Prepare-se para aumento no tempo de inicialização da aplicação e na utilização da memória  Use IsolatedStorageSettings ou ficheiros simples para conjuntos de dados em pequena quantidade
  32. APIs Novas e Actualizadas no “Mango”  Chooser Tasks relacionadas

    com dados do utilizador  EmailAddressChooserTask  PhoneNumberChooserTask  AddressChooserTask  Microsoft.Phone.UserData para acesso directo  Contacts  Appointments
  33. AddressChooserTask private AddressChooserTask addressChooserTask; // Constructor public MainPage() { this.addressChooserTask

    = new AddressChooserTask(); this.addressChooserTask.Completed += addressChooserTask_Completed; this.addressChooserTask.Show(); } private void addressChooserTask_Completed(object sender, AddressResult e) { if (null == e.Error && TaskResult.OK == e.TaskResult) { ... = e.DisplayName; ... = e.Address; } }
  34. Microsoft.Phone.UserData  Importante  As APIs de Contactos e Compromissos

    são read-only  Não é possível aceder dados de redes sociais que não são da Microsoft* * Com excepção do Facebook
  35. Contactos / Compromissos Nome e Foto do Contacto Outros dados

    do Contacto Compromissos / Eventos Windows Live Social SIM SIM SIM Windows Live Rolodex (user created and SIM import) SIM SIM n/a Exchange accounts (corporate plus Google, etc.) SIM SIM SIM Operator Address Books SIM SIM n/a Facebook SIM NÃO NÃO Other networks in the People Hub (e.g., Twitter) NÃO NÃO NÃO
  36. Contactos: Olá, Mundo! Contacts contacts = new Contacts(); contacts.SearchCompleted +=

    new EventHandler<ContactsSearchEventArgs>((sender, e) => { ... = e.Results; }); // Ex: Obter todos os contactos contacts.SearchAsync(string.Empty, FilterKind.None, null);
  37. Contactos: Olá, Mundo! Contacts contacts = new Contacts(); contacts.SearchCompleted +=

    new EventHandler<ContactsSearchEventArgs>((sender, e) => { ... = e.Results; }); // Ex: Obter todos os contactos contacts.SearchAsync(string.Empty, FilterKind.None, null); expressão de filtro (não é regex) tipo de filtro: nome, email , telefone ou pinned to start) Informações de estado
  38. Contactos: Olá, Mundo! Contacts contacts = new Contacts(); contacts.SearchCompleted +=

    new EventHandler<ContactsSearchEventArgs>((sender, e) => { ... = e.Results; }); // Ex: Obter todos os contactos contacts.SearchAsync(string.Empty, FilterKind.None, null); expressão de filtro (não é regex) tipo de filtro: nome, email , telefone ou pinned to start) Informações de estado // Ex: Procurar contactos com "J" no nome contacts.SearchAsync("J", FilterKind.DisplayName, null);
  39. Compromissos: Olá, Mundo! Appointments appointments = new Appointments(); appointments.SearchCompleted +=

    new EventHandler<AppointmentsSearchEventArgs>((sender, e) => { ... = e.Results; }); // Ex: Obter o próximo compromisso (de agora até 1 semana) appointments.SearchAsync(DateTime.Now, DateTime.Now + TimeSpan.FromDays(7), 1, null);
  40. Compromissos: Olá, Mundo! Appointments appointments = new Appointments(); appointments.SearchCompleted +=

    new EventHandler<AppointmentsSearchEventArgs>((sender, e) => { ... = e.Results; }); // Ex: Obter o próximo compromisso (de agora até 1 semana) appointments.SearchAsync(DateTime.Now, DateTime.Now + TimeSpan.FromDays(7), 1, null); Data e hora de início Número máximo de registos Informações de estado Data e hora de fim
  41. Demonstração Base de Dados  AddressChooserTask  Consulta aos Contactos

     Consulta aos Compromissos Código-fonte disponível em: https://github.com/CaioProiete/WP7MangoDevHub2011-DataAccess
  42. Performance e Boas Práticas  Seja responsável  A sua

    política de privacidade deve indicar como utiliza os contactos do utilizador  Prepare a aplicação  O tamanho da lista de contactos varia para cada utilizador  A aplicação deve saber lidar com atrasos nas consultas  Evite utilizar dados desactualizados  Dados retornados são uma cópia  Repita a consulta quando apropriado
  43. © 2011 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows

    Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries. The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.