/mdc_conference | #mdc12 Tam HANNA Tamoggemon Limited Datenpersistenz mit Windows Phone 7
/mdc_conference | #mdc12 Biographisches Tam HANNA –Gruender der Tamoggemon Ltd –Betreiber von Websites ueber Handhelds –Fachautor –Programmierer
/mdc_conference | #mdc12 Hoehepunkte Die Basics... und... Bilder ins Photoalbum speichern Dateien resusciieren LINQ to SQL Tieffliegende Schokolade
/mdc_conference | #mdc12 Von Dateisystemen
/mdc_conference | #mdc12 Die gute alte Zeit
/mdc_conference | #mdc12
/mdc_conference | #mdc12 Isolated Storage? Basis: echtes Dateisystem –KEINE Datenbank a la Palm OS Aber: jede App hat eigenen Arbeitsplatz
/mdc_conference | #mdc12 SD Card? Nur fuer OEMs gedacht –Diversifizierung des Portfolios OS verwaltet die Karte –Gibt nur Arbeitsverzeichnis frei
/mdc_conference | #mdc12 Isolated Storage Beispiel: MTPersistance1
/mdc_conference | #mdc12 Datei lesen private void CmdRead_Click(object sender, RoutedEventArgs e) { try { IsolatedStorageFile x = IsolatedStorageFile.GetUserStoreForApplication(); IsolatedStorageFileStream myStream = new IsolatedStorageFileStream("settings.tmgn", System.IO.FileMode.Open, x); StreamReader reader = new StreamReader(myStream); textBox1.Text = reader.ReadToEnd(); reader.Close(); }
/mdc_conference | #mdc12 Datei schreiben private void CmdStor_Click(object sender, RoutedEventArgs e) { try { IsolatedStorageFile x = IsolatedStorageFile.GetUserStoreForApplication(); //Create == Create OR Overwrite IsolatedStorageFileStream myStream = new IsolatedStorageFileStream("settings.tmgn", System.IO.FileMode.Create, x); StreamWriter writer = new StreamWriter(myStream); writer.Write(textBox1.Text); writer.Close(); }
/mdc_conference | #mdc12 Datei loeschen private void CmdDel_Click(object sender, RoutedEventArgs e) { try { IsolatedStorageFile x = IsolatedStorageFile.GetUserStoreForApplicatio n(); x.DeleteFile("settings.tmgn"); }
/mdc_conference | #mdc12 Diverses - I IsolatedStorageFile enthaelt: –CreateDirectory –DeleteDirectory –etcetc
/mdc_conference | #mdc12 Diverses - II Derzeit keine Quota fuer IS –Mindestspeicher am WP7 = 8GB –Ist aber geteilt (!!!) Geht bei Deinstallation verloren –Daten online speichern?
/mdc_conference | #mdc12 Isolated Preferences Beispiel: MTPersistance2
/mdc_conference | #mdc12 Was ist das? Zweiwege-Woerterbuch –Speichert Wert/Schluessel-Paare –Wert muss serialisierbar sein Automatische Persistierung Minimalloesung fuer Prefs
/mdc_conference | #mdc12 Instanz beschaffen using System.IO.IsolatedStorage; namespace MTPersistance2 { public partial class MainPage : PhoneApplicationPage { IsolatedStorageSettings mySettings; // Constructor public MainPage() { InitializeComponent(); mySettings = IsolatedStorageSettings.ApplicationSettings; }
/mdc_conference | #mdc12 Schluessel einschreiben private void CmdSave_Click(object sender, RoutedEventArgs e) { try { mySettings.Add("Textbox", textBox1.Text); } catch (ArgumentException ex) {//Wert schon da mySettings["Textbox"] = textBox1.Text; }
/mdc_conference | #mdc12 Schluessel lesen private void CmdRead_Click(object sender, RoutedEventArgs e) { try { textBox1.Text = (string)mySettings["Textbox"]; } catch (System.Collections.Generic.KeyNotFoundException ex) { MessageBox.Show(ex.Message); }
/mdc_conference | #mdc12 Schluessel loeschen private void CmdRem_Click(object sender, RoutedEventArgs e) { mySettings.Remove("Textbox"); }
/mdc_conference | #mdc12 States Beispiel: MTPersistance3
/mdc_conference | #mdc12 Was ist das? Zweiwege-Woerterbuch –Speichert Wert/Schluessel-Paare –Wert muss serialisierbar sein NUR fuer Tombstoning –Keine echte Persistierung
/mdc_conference | #mdc12 Wie bitte? Tombstoning –Oeffnen von Chooser –Druck auf Start Persistierung a la Palm OS Zwei Methoden in App.xaml.cs –IsApplicationInstancePreserved pruefen!
/mdc_conference | #mdc12 Wie bitte? // Code to execute when the application is activated (brought to foreground) // This code will not execute when the application is first launched private void Application_Activated(object sender, ActivatedEventArgs e) { } // Code to execute when the application is deactivated (sent to background) // This code will not execute when the application is closing private void Application_Deactivated(object sender, DeactivatedEventArgs e) { }
/mdc_conference | #mdc12 Mehr Grabsteine Problem: Daten auf Formularebene Loesung: Methoden auf Formularebene Problem zur Zweiten: back-button –Loesung ab 7.1
/mdc_conference | #mdc12 Code - I public partial class MainPage : PhoneApplicationPage { bool myIsNewPageInstance=false; // Constructor public MainPage() { InitializeComponent(); myIsNewPageInstance = true; }
/mdc_conference | #mdc12 Code - II protected override void OnNavigatedFrom(System.Windows.Navigation.Navig ationEventArgs e) { if (e.NavigationMode != System.Windows.Navigation.NavigationMode.Back) { State["Textbox"] = textBox1.Text; }
/mdc_conference | #mdc12 Code - III protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) { // Konstruktor aufgerufen? if (myIsNewPageInstance) { try { //Invokation erfolgt auch direkt nach Konstruktion. textBox1.Text = (string)State["Textbox"]; } catch (Exception ex) { } } myIsNewPageInstance = false; }
/mdc_conference | #mdc12 Debugging leicht gemacht
/mdc_conference | #mdc12 Eine Demo
/mdc_conference | #mdc12 Ein Helferlein Erleichtert die Persistierung von Controls –CheckBox / Radio button –List Box –PasswordBox / TextBox –Scroll viewer –Slider h ttp://tombstonehelper.codeplex.com/
/mdc_conference | #mdc12 SQL to go
/mdc_conference | #mdc12 Wie funktionierts
/mdc_conference | #mdc12 Wie funktionierts - II Objekteigenschaften -> Columns Objekte liegen in Tabellen Tabellen liegen in Datenbank
/mdc_conference | #mdc12 Wie funktionierts - III Bezug zueinander durch Schluessel
/mdc_conference | #mdc12 Persoenliche Meinung LINQ to SQL is evil –Ewige Bindung an Microsoft –Keine Skalierbarkeit –Keine Trennung der Concerns Aber: there is no bigger choice ;( –OS-Engines
/mdc_conference | #mdc12 Housekeeping
/mdc_conference | #mdc12 Die Datenklasse [Table] public class TamsClass { [Column(IsPrimaryKey = true, IsDbGenerated = true, DbType = "INT NOT NULL Identity", CanBeNull = false, AutoSync = AutoSync.OnInsert)] public int myItemId; [Column(IsVersion = true)] private System.Data.Linq.Binary _version; [Column] public string myItemName; [Column] public bool myIsComplete; }
/mdc_conference | #mdc12 Die Datenklasse - II Tag Table: –Dieses Objekt wird eine Tabelle –Klasse heisst entity class Tag Column –Dieses Attribut ist eine Tabellenspalte –IsPrimaryKey: Schluessel
/mdc_conference | #mdc12 Data Context - I public class TamsDataContext:DataContext { public string myConnStr; public TamsDataContext(string connStr) : base(connStr) { myConnStr = connStr; } public Table TamsClasses { get { return this.GetTable (); }
/mdc_conference | #mdc12 Data Context - II using System.Data.Linq; using System.Collections.Generic; using System.Linq;
/mdc_conference | #mdc12 Alle Elemente auslesen public IList GetItems() { List list = new List (); using (var db = new TamsDataContext(myConnStr)) { var query = from e in db.TamsClasses select e; list = query.ToList(); } return list; }
/mdc_conference | #mdc12 Element hinzufuegen public void AddSth(TamsClass _victim) { using (var db = new TamsDataContext(myConnStr)) { db.TamsClasses.InsertOnSubmit(_victim); db.SubmitChanges(); }
/mdc_conference | #mdc12 Datenbank erstellen public partial class MainPage : PhoneApplicationPage { TamsDataContext myTDC; public MainPage() { InitializeComponent(); myTDC = new TamsDataContext("Data Source=isostore:/TamsDB.sdf"); using (var db = myTDC) { if (!db.DatabaseExists()) db.CreateDatabase(); } IList myItems=myTDC.GetItems(); myItems = myItems; }
/mdc_conference | #mdc12 Ta-Da!
/mdc_conference | #mdc12 Daten als Ressourcen Datenbank von Haus aus bevoelkern Zwei Moeglichkeiten –Data as Code –Datenbankdatei
/mdc_conference | #mdc12 Daten als Ressourcen - II Datenbankdatei: 1.Hilfsapplikation generiert DB 2.ISETool.exe holt Datei aus IST 3.Als Ressource mitliefern (read-only!) 4.In Hauptapplikation umkopieren
/mdc_conference | #mdc12 Live Coding Beziehungen
/mdc_conference | #mdc12 Was realisieren wir?
/mdc_conference | #mdc12 Mehr Informationen LINQ to SQL kann sehr viel –Datenbank verschluesseln –Beziehungen abbilden –Aenderungen automatisch tracken Einfuehrung: 120p auf MSDN us/library/bb aspx
/mdc_conference | #mdc12 Photo ins Album
/mdc_conference | #mdc12 Problem Das Photoalbum des Benutzers ist nicht wirklich schreibbar Kamerainteraktion primaer via Chooser
/mdc_conference | #mdc12 Loesung Was Silverlight nicht kann, kann oft XNA MediaLibrary-Objekt –Erwartet Byte-Array –Schreibt immer in Saved Pictures
/mdc_conference | #mdc12 Word aus Resource
/mdc_conference | #mdc12 Problem Word-Dateien, etc ins Office schreiben –Dank Isolated Storage unmoeglich Idee: aus resusciieren
/mdc_conference | #mdc12 Loesung Off-Site-Service Uebertragung von Adresse & Attachment Server sendet
/mdc_conference | #mdc12 Tam HANNA Tamoggemon Limited