32
Oliver Scheer Senior Technical Evangelist Microsoft Deutschland http://the-oliver.com Local Database

Windows Phone 8 - 7 Local Database

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: Windows Phone 8 - 7 Local Database

Oliver Scheer

Senior Technical Evangelist

Microsoft Deutschland

http://the-oliver.com

Local Database

Page 2: Windows Phone 8 - 7 Local Database

Agenda

Database Support in Windows Phone OS

LINQ to SQL Queries Inserts, updates, deletes… Database schema upgrades

Performance and best practices

Page 3: Windows Phone 8 - 7 Local Database

LINQ to SQL in Windows Phone OS

Page 4: Windows Phone 8 - 7 Local Database

LINQ to Everything

LINQ

Objects XML SQLUser Data

7 7.1/8.0

OData

Page 5: Windows Phone 8 - 7 Local Database

Complex Schema

•Numerous relationships and constraints

•Example: Shopping List• 7 tables• 100s of records• 5 foreign keys

ItemReferenceData

PK ItemId

ItemName ItemDescriptionFK1 CategoryId

Categories

PK CategoryId

CategoryName

Lists

PK ListId

ListName

ListItems

PK ListItemId

ListItemNameFK1 ListId Quantity Category DescriptionFK2 StoreId

Stores

PK StoreId

StoreName StoreLocationLat StoreLocationLong StoreAddressLine1 StoreAddressLine2 StoreAddressCity StoreAddressState StoreAddressCountry StoryAddressZip

Favorites

PK FavoriteItemId

FavoriteItemName FavoriteItemCategory FavoriteItemQuantity FavoriteItemDescriptionFK1 FavoriteItemListId FavoriteItemPhoto

History

PK HistoryItemId

HistoryItemName HistoryItemCategory HistoryItemQuantity HistoryItemDescriptioin HistoryItemDateAddedFK1 HistoryItemListId HistoryItemPhoto

Page 6: Windows Phone 8 - 7 Local Database

Reference Data

•Huge amounts of static reference data

•Example: dictionary app• 3 tables• 1 table with 500k rows

Words

PK WordId

Word Pronunciation Definition AlternateSpellings Origin

Favorites

PK FavoriteId

FK1 WordId

History

PK HistoryItemId

FK1 WordId AddedDate

Page 7: Windows Phone 8 - 7 Local Database

Web Service Cache

•Fetch reference data from cloud

•Cache locally

•Combine with user-specific data

Cloud Service

Windows Phone

Service

Cache

User Data

Page 8: Windows Phone 8 - 7 Local Database

Demo 1: Local Database Storage

Page 9: Windows Phone 8 - 7 Local Database

Database Support in Windows Phone 7.1 and later

Page 10: Windows Phone 8 - 7 Local Database

Local Data Storage: Overview

Apps store private data in Isolated Storage Settings and properties in the app

dictionary Unstructured data in Isolated Storage files Structured data in database files

ApplicationSettings File

AppCreates/Managesfiles and settings

ApplicationFiles

Iso Store Folder

Creates root folder

sandboxed to App

Package Manager

App Data Folder

WP7 Isolated Storage

APIs

Install

DB

Database file

DB DatabaseFile (r/o)

Page 11: Windows Phone 8 - 7 Local Database

Architecture

Your AppCustom Data Context

App Objects

System.Data.Linq

Identity Management

Change Tracking

Update Processing

Object Materialization

Microsoft.Phone.Data.Internal

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 == “USA" } .Lambda #Lambda2(w.Country $w) { $w.Name }

var query = from w in db.Wines where w.Country == "USA" select w.Name;

select Namefrom Wineswhere Country = "USA"

Page 12: Windows Phone 8 - 7 Local Database

Objects, Objects, Objects…

Design time

Create object model: wines, varietals, vineyards, etc.

Decorate objects with attributes for persistence

Run time

Create DataContext reference to database

Translate object model into a database file

Submit API persists changes to DB

Database upgrade

Create new objects to enable new features

Use upgrade APIs to change DB

Varietals Wines

Vineyards WineMakers

Wines

PK WineID

Name Description RetailPriceFK2 VarietalIDFK1 VineyardID

Vineyards

PK VineyardID

Name Latitude Longitude Country

Varietals

PK VarietalID

Name

Winemaker

PK WinemakerID

FirstName LastName

Page 13: Windows Phone 8 - 7 Local Database

Database Creation: Example // Define the tables in the database

[Table]

public class Wine : INotifyPropertyChanged, INotifyPropertyChanging

{

private string wineID;

private string name;

[Column(IsPrimaryKey=true)]

public string WineID

{

get { return wineID; }

set {

         InvokePropertyChanging(new PropertyChangingEventArgs("WineID"));

            wineID = value;

             InvokePropertyChanged(new PropertyChangedEventArgs("WineID"));

         }  

}

[Column]

public string Name { ... }

...

}

Define Tables

Page 14: Windows Phone 8 - 7 Local Database

Database Creation: Example

// Define the data context.

public partial class WineDataContext : DataContext

{

public Table<Wine> Wines;

public Table<Vineyard> Vineyards;

public WineDataContext(string connection) :

base(connection) { }

}

...

// Create the database from data context, using a connection

string

DataContext db = new WineDataContext("isostore:/wineDB.sdf");

if (!db.DatabaseExists())

db.CreateDatabase();

• Define DataContext and Create Database

Page 15: Windows Phone 8 - 7 Local Database

Using SQLMetal code generator tool

• Use Visual Studio or SQL Server Management

Studio visual designers to create a SQL Server

Compact Edition 3.5 database on Dev PC

• Start a Visual Studio Command Prompt

• Run the SQLMetal tool to generate

LINQ to SQL code file

• c:\>Sqlmetal /code:northwindEntities.cs

/context:NorthwindDataContext

/pluralize northwind.sdf

• Include generated code in your Windows Phone project• Few fixes required to get it to compile

Using SQLMetal code generator tool

Page 16: Windows Phone 8 - 7 Local Database

Queries: Examples

// Create the database form data context, using a connection string DataContext db = new WineDataContext("isostore:/wineDB.sdf");

// Find all wines currently at home, ordered by date acquired var q = from w in db.Wines

where w.Varietal.Name == “Shiraz” && w.IsAtHome == true orderby w.DateAcquired select w;

Page 17: Windows Phone 8 - 7 Local Database

DB

DataContextName Little

Penguin

Varietal Pinot Noir

AtHome False

Name Little Penguin

Varietal Pinot Noir

AtHome True

Inserts/Updates/Deletes

• It’s all about the DataContext• Changes made against

the DataContext first• Changes persisted

by calling SubmitChanges()

• SubmitChanges• LINQ to SQL determines change

set and submits to DB

Name Little Penguin

Varietal Pinot Noir

AtHome False

Your App Code

Name Yellow Tail

Varietal

Pinot Noir

AtHome

True

Page 18: Windows Phone 8 - 7 Local Database

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();

Page 19: Windows Phone 8 - 7 Local Database

Inserts/Updates/Deletes

Delete

var vineyardsToDelete = from Vineyards v in db.Vineyardswhere v.Country == “Australia”select v;

db.Vineyards.DeleteAllOnSubmit(vineyardsToDelete);

db.SubmitChanges();

Page 20: Windows Phone 8 - 7 Local Database

Demo 2: Programming LINQ to SQL

Page 21: Windows Phone 8 - 7 Local Database

Relationships

•Express one-many, one-one and many-

many relationships using EntitySet<T>

and

EntityRef<T> columns

• In the relational database, a child table

has a column – the Foreign Key – that

stores the unique ID of a record in the

parent table

Words

PK WordId

Word Pronunciation Definition AlternateSpellings Origin

Favorites

PK FavoriteId

FK1 WordId

History

PK HistoryItemId

FK1 WordId AddedDate

Page 22: Windows Phone 8 - 7 Local Database

Example: Parent Object

[Table]     public class Contact : INotifyPropertyChanged, INotifyPropertyChanging{ // Fields           private EntitySet<Lead> leads = new EntitySet<Lead>();

  [Association(Storage = "leads", OtherKey = "ContactID")]    public EntitySet<Lead> Leads          {         get { return this.leads; }         set {             InvokePropertyChanging( new PropertyChangingEventArgs("Leads"));             this.leads.Assign(value);             InvokePropertyChanged( new PropertyChangedEventArgs("Leads"));         }          }

Page 23: Windows Phone 8 - 7 Local Database

Example: Child Object

[Table]     [Index (Name="ContactID_Idx", Columns="ContactID", IsUnique=false)]public class Lead : INotifyPropertyChanged, INotifyPropertyChanging     {  private EntityRef<Contact> contact;

   [Column]    public long ContactID {get; set; }

    [Association(Storage = "contact", ThisKey = "ContactID", IsForeignKey=true)]    public Contact Contact    {        get { return this.contact.Entity; }        set {           InvokePropertyChanging(new PropertyChangingEventArgs("Contact"));                  this.contact.Entity = value;           InvokePropertyChanged(new PropertyChangedEventArgs("Contact"));                  if (value != null)               this.ContactID = value.ContactID;         }    }

Page 24: Windows Phone 8 - 7 Local Database

Deletes

Deletevar contactsToDelete =

from Contact c in db.Contactswhere c.Company == “Appamundi”select c;

db.Contacts.DeleteAllOnSubmit(contactsToDelete);

db.SubmitChanges();

Foreign key constraint will cause exception here if child entities associated with the Contacts are not deleted first

Page 25: Windows Phone 8 - 7 Local Database

Delete Child Objects First

var contactsToDelete = from Contact c in db.Contactswhere c.Company == “Appamundi"

select c;

foreach (Contact c in contactsToDelete){ db.Leads.DeleteAllOnSubmit(c.Leads);}

db.Contacts.DeleteAllOnSubmit(contactsToDelete);db.SubmitChanges();

Page 26: Windows Phone 8 - 7 Local Database

Demo 3: Entity RelationshipsForeign Keys

Page 27: Windows Phone 8 - 7 Local Database

Database Schema Upgrades

•DatabaseSchemaUpdater allows simple upgrades

on your existing DB

• Supports adding• Tables• Columns• Indices• Associations/foreign keys

• Schema updates are transactional

Page 28: Windows Phone 8 - 7 Local Database

Database Schema Upgrades

WineDataContext wineDC = new WineDataContext(App.WineDBConnectionString);

DatabaseSchemaUpdater dsu = wineDC.CreateDatabaseSchemaUpdater();

if (dsu.DatabaseSchemaVersion == 1){

dsu.AddColumn<Wine>("BottleType");dsu.DatabaseSchemaVersion = 2;

dsu.Execute();}         

Page 29: Windows Phone 8 - 7 Local Database

Best Practices

Page 30: Windows Phone 8 - 7 Local Database

LINQ to SQL Performance and Best Practices

• Keep change sets small• Submit early and often to avoid data loss on app termination

•Use background threads•Non-trivial operations will impact app responsiveness if done on UI thread

•Optimize read-only queries• Set ObjectTrackingEnabled to minimize memory usage

•Use secondary indices for properties which you query often

Page 31: Windows Phone 8 - 7 Local Database

LINQ to SQL Performance and Best Practices

• Populate large reference data tables in advance• Create a simple project to prepopulate data in emulator• Pull out database file using Isolated Storage explorer

•Use the right tool for the job•Database for large or complex data sets• IsolatedStorageSettings or basic files for small data sets

Page 32: Windows Phone 8 - 7 Local Database

The information herein is for informational purposes only an 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.

© 2012 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.

MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.