Windows Phone wird mit Mango relational

8. Juni 2011

Mit dem für das 4. Quartal angekündigtem Mango-Update von Windows Phone 7 (Version sehr wahrscheinlich Windows Phone 7.5) wird nun eine relationale Datenbank in Form einer SQL Server Compact Edition (CE) für das Windows Phone zur Verfügung gestellt.

Damit es dann möglich, größere Datenmengen lokal in relationaler Form abzuspeichern. Der Zugriff ist allerdings auf die jeweilige App beschränkt, da die SQL Compact Datenbank auch im Isolated Storage abgelegt wird. Aktuell muss zur Speicherung von größeren Datenmengen noch auf 3rd Party Lösungen wie z.B. Ninja Database Lite (Ninja Database Lite) zurückgegriffen werden. Üblicherweise werden deshalb in heutigen Apps sehr oft die Daten durch Serialisieren bzw. Deserialisieren der Daten und Speicherung in XML-Dateien persistiert. Da dieser Vorgang sehr zeitaufwändig ist und eine entsprechende Implementierung stets mit einer Auslagerung in Hintergrund-Prozessen verbunden ist, stand die Unterstützung einer lokalen SQL Server Datenbank sehr weit oben auf der Wunschliste. Für Entwickler wird diese Möglichkeit bereits Ende Mai mit dem Update der Windows Phone Developer Tools zur Verfügung stehen.

Ein kleiner Wehrmutstropfen muss die Entwicklergemeinde aber dennoch schlucken. Die SQL Server Compact Edition für Windows Phone wird zunächst keine direkte Synchronisation mit einer Unternehmensdatenbank und keinen Zugriff über DML/DDL Kommandos unterstützen. Eine Verwaltung der SQL Server Compact Datenbank wird für den Entwickler über Visual Studio und zusätzlichen Tools möglich sein.

Für den Zugriff auf die SQL Server Compact Datenbank aus einer App steht Linq to SQL zur Verfügung. Linq to SQL besteht aus einem Objektmodell und einer Laufzeitkomponente. Die Laufzeitkomponente handhabt die Kommunikation zwischen dem Objektmodell und der lokalen relationalen Datenstruktur in der SQL Server Datenbank. Das Linq to SQL für Windows Phone ist nahezu identisch mit dem normalen Linq to SQL. Ein einschneidender Unterschied ist das Fehlen von ExecuteCommand, so dass keine Transact SQL Befehle direkt ausgeführt werden können. Eine genaue Aufstellung der Abweichungen sind unter LINQ to SQL Support for Windows Phone zu finden.

Der DataContext

Durch den DataContext erfolgt der Zugriff auf die gemappten SQL-Tabellen. Hierzu muss lediglich eine neue Klasse von DataContext abgeleitet werden.

public class PrivatbilanzDataContext : DataContext

{

    public Table<Aktie> Aktien; 

    public Table<Immobilie> Immobilien; 

    public BooksDataContext(string connection) : base(connection) { }

}

Datenklasse

Die Definition der dazugehörigen Daten-Klassen erfolgt recht einfach, wie es am Beispiel der Immobilie zu sehen ist.

[Table] 

public class Immobilie

{

    [Column( IsPrimaryKey = true )]  

    public string ImmobilienID { get; set; }   

    [Column]    

    public string Bezeichnung { get; set; }   

    [Column]    

    public string Ort { get; set; }      

    [Column]  

    public int Baujahr { get; set; }

}

Durch Linq to SQL wird diese Struktur auf die entsprechende Tabellenstruktur gemappt. Existiert die Datenbank und damit die Tabellenstruktur noch nicht, kann man sich die Datenbank auch durch die Linq to SQL Laufzeitkomponente durch CreateDatabase erzeugen lassen. Es existieren zusätzlich zu den Attributen Table und Column noch Weitere, um z.B. Relationen abzubilden.

Datenbank-Instanz erzeugen
var dbContext = new BooksDataContext("isostore:/PrivatbilanzDB.sdf");

if (!dbContext.DatabaseExists())

{

    dbContext.CreateDatabase();

}

Objekte einfügen

Sollen neue Tabelleneinträge in der Datenbank angelegt werden, muss lediglich eine neue Instanz der zuvor definierten Datenklasse erzeugt und anschließend im entsprechenden DataContext-Objekt hinzugefügt werden. Durch den Aufruf von SubmitChanges werden dann alle offenen DB-Aktionen des DataContext ausgeführt.

var immobilie = new Immobilie()

    {

        ImmobilieID = "1",    

        Bezeichnung = "Villa Wunderschön",   

        Ort = "Chiemsee",   

        Baujahr = 1895

    }; 

            

db.Immobilien.InsertOnSubmit( immobilie );

 

db.SubmitChanges();

Datenbank abfragen

Mittels einer normalen Linq-Abfrage können dann die Inhalte der lokalen Datenbank über den DataContext abgefragt und dann z.B. einer ListBox als Quelle übergeben werden:

var q = from immo in db.Immobilien            

        orderby immo.Bezeichnung    

        select immo;   

List<Immobilie> immobilien = q.ToList();

 

ImmobilienListBox.ItemsSource = immobilien;

Fazit

Mit der lokalen SQL Server Compact Datenbank steht dem Entwickler mit dem Mango-Update von Windows Phone eine leistungsfähige Erweiterung zur Verfügung, um auch größere Datenmengen lokal zu speichern und mit bekannten Mitteln abzufragen. Die Defizite wie die fehlende Möglichkeit einer direkten Datenbank-Synchronisierung sind erst einmal zu verkraften, weil man dies auch durch Web-Services bewerkstelligen kann.