Your SlideShare is downloading. ×
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Funcionalidades de Acesso a Dados no 'Mango'
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Funcionalidades de Acesso a Dados no 'Mango'

1,350

Published on

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. …

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

1 Comment
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total Views
1,350
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
1
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 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
  • 12. Base de Dados
  • 13. Armazenamento Local de Dados
    Aplicaçõesguardamdados privados no Isolated Storage
    • Definições e propriedades no dicionário
    • 14. Dados nãoestruturadosemficheiros
    • 15. Dados estruturadosem bases de dados
    Pasta 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. Armazenamento Local de Dados
    Aplicaçõesguardamdados privados no Isolated Storage
    • Definições e propriedades no dicionário
    • 17. Dados nãoestruturadosemficheiros
    • 18. Dados estruturadosem bases de dados
    Pasta 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. Armazenamento Local de Dados
    Aplicaçõesguardamdados privados no Isolated Storage
    • Definições e propriedades no dicionário
    • 20. Dados nãoestruturadosemficheiros
    • 21. Dados estruturadosem bases de dados
    Pasta 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
  • 23. Arquitectura
  • 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)
  • 27. Desenvolvimento “Code First”
  • 28. Desenvolvimento “Code First”
    Design time
    • Criar o modelo de classes: wines, varietals, vineyards, etc.
    • 29. Decorar as classes com osatributosparapersistência dos dados
    Varietals
    Wines
    Vineyards
  • 30. Desenvolvimento “Code First”
    Design time
    • Criar o modelo de classes: wines, varietals, vineyards, etc.
    • 31. Decorar as classes com osatributosparapersistência dos dados
    Varietals
    Wines
    Vineyards
    • Criar o DataContextreferente a base de dados
    • 32. Transformarmodelo de classes no ficheiro da base de dados
    • 33. Persistir as alteraçõesna base de dados através da API
    Run time
  • 34. Desenvolvimento “Code First”
    Design time
    • Criar o modelo de classes: wines, varietals, vineyards, etc.
    • 35. Decorar as classes com osatributosparapersistência dos dados
    Varietals
    Wines
    Vineyards
    WineMakers
    • Criar o DataContextreferente a base de dados
    • 36. Transformarmodelo de classes no ficheiro da base de dados
    • 37. Persistir as alteraçõesna base de dados através da API
    Run time
    Database upgrade
    • Criarnovas classes com as alterações
    • 38. Utilizar APIs de actualizaçãoparaalterar a base de dados
  • Criação da Base de Dados: Exemplo
    // Define o DataContext.
    publicpartialclassWineDataContext: DataContext
    {
    publicTable<Wine> Wines;
    publicTable<Vineyard> Vineyards;
    publicWineDataContext(stringconnectionString) : base(connectionString) { }
    }
    // Define as tabelas da base de dados
    [Table]
    publicclassWine
    {
    [Column(IsPrimaryKey=true]
    publicstringWineID{ get; set; }
    [Column]
    publicstringName { get; set; }
    ……
    }
    // Cria a base de dados no isolated storage, se nãoexistir
    DataContextdb = newWineDataContext("isostore:/WineDB.sdf");
    if (!db.DatabaseExists()) db.CreateDatabase();
  • 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
  • 51. Dados do Utilizador
  • 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
  • 55. Contactos / Compromissos
  • 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
  • 63. Questões?
  • 64. Obrigado!
    Caio Proiete
    caio@netponto.org
    http://caioproiete.net
    http://twitter.com/caioproiete

×