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.
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
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
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
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)
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
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
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
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();
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;
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
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
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
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
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
com dados do utilizador EmailAddressChooserTask PhoneNumberChooserTask AddressChooserTask Microsoft.Phone.UserData para acesso directo Contacts Appointments
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
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
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);
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
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
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.