Www.mobile-developer-conference.de /mdc_conference | #mdc12 Tam HANNA Tamoggemon Limited...
-
Upload
hrodulf-adler -
Category
Documents
-
view
103 -
download
0
Transcript of Www.mobile-developer-conference.de /mdc_conference | #mdc12 Tam HANNA Tamoggemon Limited...
www.mobile-developer-conference.de /mdc_conference | #mdc12
Tam HANNATamoggemon Limited
Datenpersistenz mitWindows Phone 7
www.mobile-developer-conference.de /mdc_conference | #mdc12
Biographisches
• Tam HANNA– Gruender der
Tamoggemon Ltd– Betreiber von
Websites ueber Handhelds
– Fachautor– Programmierer
www.mobile-developer-conference.de /mdc_conference | #mdc12
Hoehepunkte
• Die Basics ... und ...
• Bilder ins Photoalbum speichern• Dateien „resusciieren“• LINQ to SQL
• Tieffliegende Schokolade
www.mobile-developer-conference.de /mdc_conference | #mdc12
Von Dateisystemen
www.mobile-developer-conference.de /mdc_conference | #mdc12
Die “gute alte Zeit”
www.mobile-developer-conference.de /mdc_conference | #mdc12
www.mobile-developer-conference.de /mdc_conference | #mdc12
Isolated Storage?
• Basis: echtes Dateisystem– KEINE Datenbank a la Palm OS
• Aber: jede App hat eigenen Arbeitsplatz
www.mobile-developer-conference.de /mdc_conference | #mdc12
SD Card?
• Nur fuer OEMs gedacht– Diversifizierung des Portfolios
• OS verwaltet die Karte– Gibt nur Arbeitsverzeichnis frei
www.mobile-developer-conference.de /mdc_conference | #mdc12
Isolated Storage
Beispiel: MTPersistance1
www.mobile-developer-conference.de /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();
}
www.mobile-developer-conference.de /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(); }
www.mobile-developer-conference.de /mdc_conference | #mdc12
Datei loeschen
private void CmdDel_Click(object sender, RoutedEventArgs e)
{ try { IsolatedStorageFile x =
IsolatedStorageFile.GetUserStoreForApplication();
x.DeleteFile("settings.tmgn"); }
www.mobile-developer-conference.de /mdc_conference | #mdc12
Diverses - I
• IsolatedStorageFile enthaelt:– CreateDirectory– DeleteDirectory– etcetc
www.mobile-developer-conference.de /mdc_conference | #mdc12
Diverses - II
• Derzeit keine Quota fuer IS– Mindestspeicher am WP7 = 8GB– Ist aber geteilt (!!!)
• Geht bei Deinstallation verloren– Daten online speichern?
www.mobile-developer-conference.de /mdc_conference | #mdc12
Isolated Preferences
Beispiel: MTPersistance2
www.mobile-developer-conference.de /mdc_conference | #mdc12
Was ist das?
• Zweiwege-Woerterbuch– Speichert Wert/Schluessel-Paare– Wert muss serialisierbar sein
• Automatische Persistierung
• Minimalloesung fuer „Prefs“
www.mobile-developer-conference.de /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; }
www.mobile-developer-conference.de /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; } }
www.mobile-developer-conference.de /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); } }
www.mobile-developer-conference.de /mdc_conference | #mdc12
Schluessel loeschen
private void CmdRem_Click(object sender, RoutedEventArgs e)
{
mySettings.Remove("Textbox");
}
www.mobile-developer-conference.de /mdc_conference | #mdc12
States
Beispiel: MTPersistance3
www.mobile-developer-conference.de /mdc_conference | #mdc12
Was ist das?
• Zweiwege-Woerterbuch– Speichert Wert/Schluessel-Paare– Wert muss serialisierbar sein
• NUR fuer Tombstoning– Keine „echte Persistierung“
www.mobile-developer-conference.de /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!
www.mobile-developer-conference.de /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) { }
www.mobile-developer-conference.de /mdc_conference | #mdc12
Mehr Grabsteine
• Problem: Daten auf Formularebene• Loesung: Methoden auf
Formularebene
• Problem zur Zweiten: back-button– Loesung ab 7.1
www.mobile-developer-conference.de /mdc_conference | #mdc12
Code - I
public partial class MainPage : PhoneApplicationPage { bool myIsNewPageInstance=false;
// Constructor public MainPage() { InitializeComponent(); myIsNewPageInstance = true; }
www.mobile-developer-conference.de /mdc_conference | #mdc12
Code - II
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
{ if (e.NavigationMode !=
System.Windows.Navigation.NavigationMode.Back) { State["Textbox"] = textBox1.Text; } }
www.mobile-developer-conference.de /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;• }
www.mobile-developer-conference.de /mdc_conference | #mdc12
Debugging leicht gemacht
www.mobile-developer-conference.de /mdc_conference | #mdc12
Eine Demo
www.mobile-developer-conference.de /mdc_conference | #mdc12
Ein Helferlein
• Erleichtert die Persistierung von Controls– CheckBox / Radio button– List Box– PasswordBox / TextBox– Scroll viewer– Slider
• http://tombstonehelper.codeplex.com/
www.mobile-developer-conference.de /mdc_conference | #mdc12
SQL to go
www.mobile-developer-conference.de /mdc_conference | #mdc12
Wie funktioniert‘s
www.mobile-developer-conference.de /mdc_conference | #mdc12
Wie funktioniert‘s - II
• Objekteigenschaften -> Columns
• Objekte liegen in Tabellen
• Tabellen liegen in Datenbank
www.mobile-developer-conference.de /mdc_conference | #mdc12
Wie funktioniert‘s - III
• Bezug zueinander durch Schluessel
www.mobile-developer-conference.de /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
www.mobile-developer-conference.de /mdc_conference | #mdc12
Housekeeping
www.mobile-developer-conference.de /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; }
www.mobile-developer-conference.de /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
www.mobile-developer-conference.de /mdc_conference | #mdc12
Data Context - I
public class TamsDataContext:DataContext { public string myConnStr; public TamsDataContext(string connStr) : base(connStr) { myConnStr = connStr; }
public Table<TamsClass> TamsClasses { get { return this.GetTable<TamsClass>(); } }
www.mobile-developer-conference.de /mdc_conference | #mdc12
Data Context - II
• using System.Data.Linq;
• using System.Collections.Generic;
• using System.Linq;
www.mobile-developer-conference.de /mdc_conference | #mdc12
Alle Elemente auslesen
public IList<TamsClass> GetItems() { List<TamsClass> list = new List<TamsClass>(); using (var db = new TamsDataContext(myConnStr)) { var query = from e in db.TamsClasses select e; list = query.ToList(); } return list; }
www.mobile-developer-conference.de /mdc_conference | #mdc12
Element hinzufuegen
public void AddSth(TamsClass _victim) { using (var db = new
TamsDataContext(myConnStr)) {
db.TamsClasses.InsertOnSubmit(_victim); db.SubmitChanges(); } }
www.mobile-developer-conference.de /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<TamsClass> myItems=myTDC.GetItems(); myItems = myItems; }
www.mobile-developer-conference.de /mdc_conference | #mdc12
Ta-Da!
www.mobile-developer-conference.de /mdc_conference | #mdc12
Daten als Ressourcen
• Datenbank von Haus aus „bevoelkern“
• Zwei Moeglichkeiten– „Data as Code“– Datenbankdatei
www.mobile-developer-conference.de /mdc_conference | #mdc12
Daten als Ressourcen - II
• Datenbankdatei:1. Hilfsapplikation generiert DB2. ISETool.exe holt Datei aus IST3. Als Ressource mitliefern (read-only!)4. In Hauptapplikation umkopieren
www.mobile-developer-conference.de /mdc_conference | #mdc12
Live Coding
Beziehungen
www.mobile-developer-conference.de /mdc_conference | #mdc12
Was realisieren wir?
www.mobile-developer-conference.de /mdc_conference | #mdc12
Mehr Informationen
• LINQ to SQL kann sehr viel– Datenbank verschluesseln– Beziehungen abbilden– Aenderungen automatisch tracken
• Einfuehrung: 120p auf MSDN• http://msdn.microsoft.com/en-us/
library/bb425822.aspx
www.mobile-developer-conference.de /mdc_conference | #mdc12
Photo ins Album
www.mobile-developer-conference.de /mdc_conference | #mdc12
Problem
• Das Photoalbum des Benutzers ist nicht wirklich „schreibbar“
• Kamerainteraktion primaer via Chooser
www.mobile-developer-conference.de /mdc_conference | #mdc12
Loesung
• Was Silverlight nicht kann, kann oft XNA
• MediaLibrary-Objekt– Erwartet Byte-Array– Schreibt immer in „Saved Pictures“
www.mobile-developer-conference.de /mdc_conference | #mdc12
Word aus Resource
www.mobile-developer-conference.de /mdc_conference | #mdc12
Problem
• Word-Dateien, etc ins Office schreiben– Dank Isolated Storage unmoeglich
• Idee: aus e-mail resusciieren
www.mobile-developer-conference.de /mdc_conference | #mdc12
Loesung
• Off-Site-Service
• Uebertragung von Adresse & Attachment
• Server sendet e-mail
www.mobile-developer-conference.de /mdc_conference | #mdc12
Tam HANNA (@tamhanna)
Tamoggemon [email protected]
www.tamoggemon.com