windows phone 8 - 7 local database
DESCRIPTION
TRANSCRIPT
![Page 1: Windows Phone 8 - 7 Local Database](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/1.jpg)
Oliver Scheer
Senior Technical Evangelist
Microsoft Deutschland
http://the-oliver.com
Local Database
![Page 2: Windows Phone 8 - 7 Local Database](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/2.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/3.jpg)
LINQ to SQL in Windows Phone OS
![Page 4: Windows Phone 8 - 7 Local Database](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/4.jpg)
LINQ to Everything
LINQ
Objects XML SQLUser Data
7 7.1/8.0
OData
![Page 5: Windows Phone 8 - 7 Local Database](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/6.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/7.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/8.jpg)
Demo 1: Local Database Storage
![Page 9: Windows Phone 8 - 7 Local Database](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/9.jpg)
Database Support in Windows Phone 7.1 and later
![Page 10: Windows Phone 8 - 7 Local Database](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/10.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/11.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/13.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/20.jpg)
Demo 2: Programming LINQ to SQL
![Page 21: Windows Phone 8 - 7 Local Database](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/21.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/26.jpg)
Demo 3: Entity RelationshipsForeign Keys
![Page 27: Windows Phone 8 - 7 Local Database](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/27.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/28.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/29.jpg)
Best Practices
![Page 30: Windows Phone 8 - 7 Local Database](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/30.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/31.jpg)
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](https://reader033.vdocuments.mx/reader033/viewer/2022061218/54812e54b4795932578b482c/html5/thumbnails/32.jpg)
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.