Isolated Storage unter Microsofts Windows Phone 7

Seite 3: Die Datenbank beschreiben

Inhaltsverzeichnis

Im nächsten Schritt soll die Datenbank mit einigen Dummy-Daten befüllt werden. Für die Aufnahme der Nutzerdaten gibt es diverse komplexe Möglichkeiten, besonders schnell und einfach geht es direkt über den Code. Im Beispiel wird das Einschreiben durch einen Klick auf den Button "Bevölkern" ausgelöst, das folgende Listing zeigt die entsprechende Routine. Wie zu sehen, ist Datenbank-Bevölkerungscode oft lang und meist nicht sehr interessant. Im Unternehmen des Autors gibt es eine Qt-Implementierung, deren Datenbankschema 20 DIN-A-4-Seiten füllt.

private void CmdPopulate_Click(object sender, RoutedEventArgs e)
{
using (var myDb = new MyDataContext("Data Source=isostore:/DB.sdf"))
{
myStatii = myDb.Statii;
myKunden = myDb.Kunden;

Statii silverStatus=new Statii();
silverStatus.myName = "Silver";
myStatii.InsertOnSubmit(silverStatus);
Statii goldStatus = new Statii();
goldStatus.myName = "Gold";
myStatii.InsertOnSubmit(goldStatus);
Statii platinStatus = new Statii();
platinStatus.myName = "Platin";
myStatii.InsertOnSubmit(platinStatus);

//BP vor und nach dieser Zeile !!

myDb.SubmitChanges();

Kunden arbeitsKunde;
arbeitsKunde = new Kunden();
arbeitsKunde.myName = "A";
arbeitsKunde.mySurName = "SurA";
arbeitsKunde.myStatus = silverStatus.myStatusId;
myKunden.InsertOnSubmit(arbeitsKunde);
arbeitsKunde = new Kunden();
arbeitsKunde.myName = "B";
arbeitsKunde.mySurName = "SurB";
arbeitsKunde.myStatus = silverStatus.myStatusId;
myKunden.InsertOnSubmit(arbeitsKunde);
arbeitsKunde = new Kunden();
arbeitsKunde.myName = "C";
arbeitsKunde.mySurName = "SurC";
arbeitsKunde.myStatus = goldStatus.myStatusId;
myKunden.InsertOnSubmit(arbeitsKunde);
arbeitsKunde = new Kunden();
arbeitsKunde.myName = "D";
arbeitsKunde.mySurName = "SurD";
arbeitsKunde.myStatus = platinStatus.myStatusId;
myKunden.InsertOnSubmit(arbeitsKunde);
myDb.SubmitChanges();

myDb.Dispose();
}
}
Mehr Infos

Irrsinn mit SQL

Microsoft empfiehlt folgende Vorgehensweise für das Anlegen einer Datenbank: Man entwirft im ersten Schritt ein Generatorprogramm und lässt es im Simulator laufen. Die erstellte Datenbank pickt man über den Isolated Storage Explorer aus dem Emulator und liefert sie als Bundle mit der Anwendung aus. Beim ersten Run kopiert man diese Datei schließlich aus dem Code aus den Ressourcen in den Isolated Storage.

Das zugrundeliegende Schema ist simpel: Man beschafft sich einen Pointer auf einen DataContext, erstellt Instanzen der zu speichernden Klassen und schreibt sie in die vom DataContext exponierten Datentabellen. Die Aufrufe von SubmitChanges schließen die Einfügeoperationen ab. Am Ende der Verarbeitung trägt man den DataContext mit Dispose ab.

Es ist für das Verständnis besonders wichtig, vor und nach der vom Autor im vorangegangenen Listing kommentierten Zeile die Status im Debugger zu betrachten. Die Abbildung 1 zeigt den Status vor, die Abbildung 2 den Zustand nach der Abarbeitung des SubmitChanges-Befehls.

Isolated Storage in WP7 (2 Bilder)

Abbildung 1

Der Debugger gibt Aufschluss über das Befüllen der Datenbank. Zunächst haben alle drei Status die ID 0 (Abb. 1).

Es zeigt sich, dass die von der Datenbank berechneten Indizes erst nach dem Aufruf von SubmitChanges final sind. Aus diesem Grund müssen Entwickler eine derartige Datenbank "von unten nach oben" aufbauen – also erst die unabhängigen Werte (Status), dann die abhängigen (Kunde).