Moderne Apps

Datenzugriffs- und Datenspeicherungsoptionen in Windows Store-Apps

Rachel Appel

 

Rachel AppelDie Verwaltung von Daten spielt bei der Entwicklung von Apps eine entscheidende Rolle. Ob es sich um eine Spiele-, Nachrichten-, Reise- oder Mode-App handelt, die Daten stehen immer an erster Stelle. Moderne Apps müssen häufig Daten verwalten, die sich an mehreren unterschiedlichen Speicherorten befinden und in vielen Formaten vorliegen. In diesem Artikel gehe ich auf die verschiedenen Datenspeicherungsoptionen ein und beschreibe die Datenzugriffs-APIs, die zum Erstellen von Windows Store-Apps in allen Sprachen verfügbar sind. Außerdem erläutere ich Verwaltungsstrategien für Inhalts- und Konfigurationsdaten.

Überlegungen zur Datenverwaltung und -speicherung

Als Entwickler einer App legen Sie vor dem Projektstart fest, welche Anforderungen die App an die Daten stellt, da eine Änderung der zugrunde liegenden Architektur viele Überarbeitungen nach sich zieht. Wenn bereits eine Datenquelle vorhanden ist, wird Ihnen die Entscheidung abgenommen. Aber bei einem vollständig neuen Projekt müssen Sie überlegen, wo die Daten gespeichert werden. Die zwei Optionen lauten Speicherung auf dem Gerät oder an einem Remotespeicherort:

  • Lokal: Normalerweise befinden sich diese Daten in einer Datei oder einer lokalen Datenbank, in Windows 8 können Sie jetzt jedoch andere Apps als Datenquellen verwenden. Dazu nutzen Sie die integrierte Dateiauswahl oder Verträge. In JavaScript-Apps sind auch Web Storage und die indizierte Datenbank-API (IndexedDB) als lokale Datenquellen verfügbar.  
  • Remote: Diese Daten können sich in der Cloud befinden und dazu Windows Azure SkyDrive oder einen anderen HTTP-Endpunkt verwenden, der JSON- oder XML-Daten bereitstellen kann, einschließlich öffentlicher APIs wie Facebook oder Flickr.

Häufig bestimmt der Umfang der Daten, ob sie lokal oder remote gespeichert werden. Die meisten modernen Apps verwenden allerdings Daten aus beiden Quellen. Der Grund dafür ist, dass kleinere Geräte mit viel höherer Mobilität, wie Slate-PCs, Tablets und Telefone, die Norm sind und normalerweise keinen großen Speicherplatz haben. Trotzdem benötigen sie weiterhin Daten, um auch offline richtig zu funktionieren. Das Surface-Tablet zum Beispiel ist wie viele tragbare Geräte als 32-GB- und 64-GB-Modell erhältlich. Einfache textbasierte Daten wie JSON sind normalerweise recht klein, aber durch relationale Datenbanken und Mediendaten (z. B. Bilder, Audio und Video) kann der Platz auf einem Gerät schnell erschöpft sein.

Werfen wir einen Blick auf die verschiedenen Optionen, um App-Inhaltsdaten lokal oder remote zu speichern.

Web Storage

Web Storage (bit.ly/lml0Ul) ist nicht einfach eine Speicherung im Web, wie der englische Name nahelegen könnte. Web Storage ist vielmehr ein HTML5-Standard und eine hervorragende Methode, um App-Daten lokal auf dem Client zu speichern. Sowohl Windows Store-Apps als auch ganz gewöhnliche HTML-Seiten unterstützen Web Storage. Sie müssen weder ein Datenbanksetup ausführen noch Dateien kopieren, da Web Storage eine im Speicher befindliche Datenbank ist.

Der Zugriff auf Web Storage erfolgt in JavaScript durch eine der zwei folgenden Eigenschaften des window-Objekts:

  1. „localStorage“: Lokale Daten, die nach dem Beenden der App beibehalten werden und für zukünftige Instanzen der App verfügbar sind.
  2. „sessionStorage“: Ebenfalls lokale Daten; „sessionStorage“ wird jedoch gelöscht, wenn die Ausführung einer Windows Store-App beendet wird.

In Web Storage können Sie Daten von einfachen Typen bis zu komplexen Objekten speichern, indem Sie dynamische Eigenschaften entweder an die sessionStorage- oder an die localStorage-Variable anhängen. Die dynamischen Eigenschaften sind ein Schlüssel-Wert-Paar mit ungefähr folgender Syntax:

sessionStorage.lastPage = 5;
WinJS.xhr({ url: "data/data.json" }).then(function (xhr) {
  localStorage.data = xhr.responseText;
};

Die lastPage-Eigenschaft ist bis zum Beenden der App vorhanden, da sie ein Teil von „sessionStorage“ ist, während die Dateneigenschaft von „localStorage“ über die Lebensdauer der App hinaus bestehen bleibt.

Durch die Möglichkeit, Daten zwischen App-Sitzungen lokal beizubehalten, ist Web Storage eine sehr gute Wahl, um Offlineszenarios zu unterstützen. Für die Offlineunterstützung sind Daten mit geringem Umfang auch besser geeignet. JSON-Daten sind kompakt, und Sie können daher vollständige JSON-Datasets in den 5 MB unterbringen, die von Web Storage zur Verfügung gestellt werden, und noch ausreichend Platz für einige Mediendaten übrig haben.

Als HTML5-Standard ist Web Storage nur in Windows Store-Projekten verfügbar, die mit JavaScript erstellt wurden.

IndexedDB

Ein weiterer Standard in der HTML5-Familie ist IndexedDB (bit.ly/TT3btM), ein lokaler Datenspeicher für große, durchsuchbare und persistente Datasets. Als Komponente von HTML5 können Sie IndexedDB sowohl in clientseitigen Web-Apps für Browser als auch in Windows Store-Apps verwenden. IndexedDB speichert Elemente in einer Objektdatenbank und ist extrem flexibel, da Sie beliebige Arten von Daten speichern können, von Text bis zu BLOBs (Binary Large Objects). Multimediadateien beispielsweise sind meistens sehr groß. Daher ist IndexedDB gut geeignet, um Audio- und Videodaten zu speichern.

Da IndexedDB eine Objektdatenbank ist, werden keine SQL-Anweisungen verwendet. Sie greifen stattdessen über eine Syntax im objektorientierten Stil auf Daten zu. Die Interaktion mit einem IndexedDB-Datenspeicher erfolgt über Transaktionen und Cursor, wie im folgenden Beispiel:

var dataStore = "Datastore";
var trn = db.transaction(dataStore, IDBTransaction.READ_ONLY);
var store = trn.objectStore(dataStore);
trans.oncomplete = function(evt) { // transaction complete };
var request = store.openCursor();
request.onsuccess = function(evt) {
  var cursor = evt.openCursor();
};
request.onerror = function(error) { // error handling };

IndexedDB ist auf sehr umfangreiche Daten ausgerichtet. Wenn kleine Datenmengen gespeichert werden, zeigt IndexedDB ein ineffizientes Verhalten, was Web Storage zu einer viel besseren Wahl für lokale, kompakte Daten macht. IndexedDB ist auch für Inhaltsdaten geeignet, jedoch nicht für App-Konfigurationsdaten.

SQLite

SQLite (bit.ly/65FUBZ) ist eine eigenständige, transaktionale, relationale und dateibasierte Datenbank, die keine Konfiguration und keinen Datenbankadministrator zur Verwaltung erfordert. Sie können SQLite mit jeder Windows-Runtime(WinRT)-Sprache verwenden, und SQLite ist als Visual Studio-Erweiterung erhältlich. SQLite funktioniert zwar gut in JavaScript-Apps, Sie müssen allerdings vor der Verwendung den SQLite3-WinRT-Wrapper (bit.ly/J4zzPN) von GitHub abrufen.

Entwickler, die einen ASP.NET- oder Windows Forms-Hintergrund haben, neigen zu relationalen Datenbanken. Ein relationales Datenbankverwaltungssystem (Relational Database Management System, RDBMS) ist aber nicht immer am besten geeignet, wenn Sie moderne Apps schreiben. Das liegt an den Platzproblemen auf mobilen Geräten und an den unterschiedlichen Typen und Formaten von Daten, insbesondere Multimediadaten. SQLite als relationale Datenbank kann sinnvoll für solche Apps verwendet werden, die relationales und transaktionales Verhalten erfordern. SQLite ist daher vorzüglich für Branchenapps oder Dateneingabeapps geeignet und kann auch als Repository für lokale Offlinedaten dienen, die ursprünglich aus einer Onlinequelle stammen.

Wenn die SQLite-Datenbank für tragbare Geräte zu groß wird, können Sie sie auf einen Server oder in die Cloud verschieben. Der Code verändert sich nur geringfügig, da die SQLite3-Bibliothek eine herkömmliche Verbindung und CRUD-Objekte (Create, Read, Update, Delete) verwendet, wie im folgenden Code:

// C# code that opens an async connection.
var path =
  Windows.Storage.ApplicationData.Current.LocalFolder.Path + @"\data.db";
var db = new SQLiteAsyncConnection(path);
// JavaScript code that opens an async connection.
var dbPath =
  Windows.Storage.ApplicationData.current.localFolder.path + '\\data.db;
SQLite3JS.openAsync(dbPath).then(function (db) {
  // Code to process data.
});

Wie Sie sehen, können Sie SQLite genau wie andere SQL-Datenbanken verwenden. Eine SQLite-Datenbank kann bis zu 140 TB groß sein. Dabei ist zu beachten, dass sehr umfangreiche Datenmengen häufig eine professionelle Datenbankadministration erfordern, um die bestmögliche Integrität, Leistung und Sicherheit für die Daten zu erreichen. Die meisten Datenbankadministratoren und Entwickler, die mit relationalen Datenbanken arbeiten, verwenden lieber ein Tool mit grafischer Benutzeroberfläche, um Datenbankobjekte zu erstellen und zu verwalten oder Ad-hoc-Abfragen für Daten auszuführen. Das Dienstprogramm Sqliteman (bit.ly/9LrB1o) ist ideal für alle grundlegenden SQLite-Vorgänge.

Wenn Sie vorhandene Windows-Desktop-Apps portieren, die in Windows Forms, Windows Presentation Foundation (WPF) oder Silverlight geschrieben sind, verwenden Sie möglicherweise bereits SQL Server Compact (SQL CE). In diesem Fall können Sie SQL CE-Datenbanken mit dem Dienstprogramm ExportSqlCE (bit.ly/dwVaR3) zu SQLite migrieren und sie anschließend mit Sqliteman verwalten.

Dateien als Daten und die Datei-API

Wozu benötigen Sie überhaupt eine Datenbank, insbesondere wenn die Benutzer Ihrer App ihre bereits vorhandenen Dateien behalten möchten? Das gilt speziell für Fotos und Dokumente. Die Datei-API stellt nicht nur eine Navigation für Verzeichnisse und Dateien bereit, durch sie können die Benutzer vielmehr eine App als Dateispeicherort auswählen. Das bedeutet, dass die Apps sich untereinander verständigen und Daten austauschen können. Eine Dateiöffnungsauswahl kann sowohl mit Bing, Kamera- oder Foto-Apps als auch mit regulären Verzeichnissen und benannten Speicherorten wie beispielsweise „Eigene Dateien“, „Eigene Videos“ oder „Eigene Musik“ interagieren. Das einfache Teilen von Daten zwischen Apps, Diensten und persönlichen Dateien ist ein erstklassiges Windows-Feature.

Viele Betriebssysteme verfügen über einen Mechanismus zum Registrieren von Dateien, die von Apps verwendet werden sollen, zusätzlich zu der Fähigkeit, diese Apps zu starten, wenn ein Benutzer mit einem Symbol im Betriebssystem interagiert. In Windows wird dies als Dateizuordnung bezeichnet. Windows 8 führt dieses Konzept einen Schritt weiter, indem die Apps über die Verträge, ein systemweites Feature, miteinander kommunizieren können. Zum Implementieren eines Vertrags kann eine Dateiauswahl verwendet werden. Der folgende Code ähnelt den Dateidialog-APIs von Desktop-Apps oder früheren Windows-Versionen. In diesem Beispiel wurde einiger Code der Kürze halber ausgelassen. Eine ausführlichere Betrachtung der FileOpenPicker-Klasse finden Sie unter bit.ly/UztmDv.

fileOpen: function () {
  var openPicker = new Windows.Storage.Pickers.FileOpenPicker();
  openPicker.viewMode = Windows.Storage.Pickers.PickerViewMode.thumbnail;
  openPicker.suggestedStartLocation =
    Windows.Storage.Pickers.PickerLocationId.picturesLibrary;
  openPicker.fileTypeFilter.replaceAll([".png", ".jpg", ".jpeg"]);
  openPicker.pickSingleFileAsync().done(function (file) {
  // ...
  });
}

Durch Auswählen einer App in einer Windows 8-Auswahl wird die App gestartet. Wenn ein Benutzer zum Beispiel Bing auswählt, startet die Auswahl die Bing-App und gibt anschließend die Bildauswahl des Benutzers an Ihre App zurück.

Nach der Betrachtung der lokalen Optionen wenden wir uns nun den Optionen für remote gespeicherte Daten zu.

Webdienste und ASP.NET-Web-API

Die meisten Entwickler sind mit dem Verarbeiten und Ändern von Daten mit XML-Webdiensten vertraut, da diese bereits aus der Zeit von Microsoft .NET Framework 1.x stammen. Der Hauptvorteil der Webdienste besteht darin, dass sich die Daten an einem zentralen Remotespeicherort befinden und die Apps von mehreren Geräten jederzeit auf die Daten zugreifen können, solange eine Verbindung besteht. Der Zugriff auf die zugrunde liegende Datenbank wird über eine Reihe von HTTP-Endpunkten weitergeleitet, die JSON- oder XML-Daten austauschen. Viele öffentliche APIs wie Twitter oder Flickr machen JSON- oder XML-Daten verfügbar, die Sie in Windows Store-Apps verarbeiten können.

Webdienste gibt es in verschiedenen Versionen:

  • ASMX-Dienste: Verwenden traditionelles ASP.NET, um Daten über HTTP bereitzustellen.
  • Windows Communication Foundation(WCF)- und Rich Internet Application(RIA)-Dienste: Ein nachrichtenbasierte Methode, um Daten zwischen HTTP-Endpunkten zu senden.
  • OData: Open Data-Protokoll, eine weitere API zum Übertragen von Daten über HTTP.
  • ASP.NET-Web-API: Ein neues ASP.NET MVC 4-Framework zur einfachen Erstellung von RESTful-HTTP-Diensten, die JSON- oder XML-Daten an Apps oder Websites liefern.

Wenn Sie Back-End-Dienste vollständig neu erstellen, vereinfacht ASP.NET-Web-API den Entwicklungsprozess, da Sie die Dienste konsistent RESTful erstellen können. Die Dienste können dann leicht von Apps verarbeitet werden. 

Unabhängig vom Back-End-Dienst können Sie bei der Übertragung über HTTP die HttpWebRequest- und HttpWebResponse-Objekte verwenden, um über C# mit einem Webdienst zu kommunizieren. In JavaScript-Apps wird ein WinJS-XMLHttpRequest-Wrapper für asynchrone Vorgänge eingefügt, wie im folgenden Code:

WinJS.xhr({ url: "data.json" }).then(function (xhr) {
  var items = JSON.parse(xhr.responseText);
  items.forEach(function (item) {
    list.push(item);
  })
});

Speicherplatz ist bei Webdiensten normalerweise kein Problem, da ein Webdienst nur die Software ist, die die Daten zwischen den Endpunkten überträgt. Die zugrunde liegenden Daten können sich also an einem beliebigen Speicherort befinden, zum Beispiel auf einem Remoteserver, einem Webhost oder einer Windows Azure-Instanz.

Sie können jeden der oben erwähnten Webdienste wie beispielsweise eine Instanz von ASP.NET-Web-API oder einen WCF-Dienst zusammen mit den Daten auf Windows Azure hosten.

SkyDrive

SkyDrive (bit.ly/HYB7iw) ist nicht nur eine Option, sondern eine hervorragende Möglichkeit zum Speichern von Daten. Stellen Sie sich SkyDrive als eine Nichtspeicheroption zum Speichern vor. Die Benutzer können SkyDrive als Speicherort in der Cloud auswählen und über die Dateiöffnungs- oder Dateispeicherungsauswahl auf Dokumente zugreifen. Wenn die Benutzer Dateien auf SkyDrive speichern können, müssen Sie sich keine Gedanken über die Datenbankverwaltung machen, und mit 7 GB Speicherplatz pro Benutzer gibt es ausreichend Platz. SkyDrive-Benutzer können auch zusätzlichen Speicherplatz erwerben.

Die Live-API (bit.ly/mPNb03) enthält eine Reihe umfassender RESTful-SkyDrive-APIs zum Lesen und Schreiben auf SkyDrive. Ein SkyDrive-Aufruf zum Abrufen der Liste freigegebener Elemente sieht folgendermaßen aus:

GET https://apis.live.netv5.0/me/skydrive/shared?access_token=ACCESS_TOKEN

C#-Entwickler können mit einem Microsoft.Live-Namespace auf die Live- und SkyDrive-APIs zugreifen. JavaScript-Entwickler hingegen können mit den HTTP-Verben POST oder PUT RESTful-Aufrufe ausführen. Für App-Konfigurationsdaten wird SkyDrive nicht empfohlen.

Windows Azure Mobile Services

Windows Azure Mobile Services ist eine sehr gute Option, wenn Sie plattformübergreifende Apps oder Apps für mehrere Plattformen erstellen. Unterstützt durch Windows Azure, bietet diese Option neben skalierbarem Speicherplatz auch Pushbenachrichtigungen, Verwaltung der Geschäftslogik, eine Authentifizierungs-API und ein vollständiges SDK. Zusätzlich zu diesen Features steht Ihnen ein benutzerfreundliches, webbasiertes Verwaltungstool zur Verfügung. 

Das Mobile Services-SDK ist in Windows Store-, Windows Phone 8-, iOS- und Android-Apps integriert. Alle wichtigen Plattformen werden unterstützt. Mit dem Mobile Services-SDK können Sie in wenigen Minuten einen Arbeitsprototypen erstellen und im Handumdrehen beginnen, Daten an plattformübergreifende Apps zu liefern.

Unter den vielen Elementen im SDK findet sich auch das query-Objekt, mit dem Sie folgendermaßen Daten aus Tabellen abfragen können:

var query = table.orderBy('column').read({ success: function(results) { ... }});

Wie Sie sehen, entspricht der Code in etwa dem anderer APIs, sodass die Lernkurve dieselbe ist wie bei den anderen Optionen, die hier aufgeführt wurden. Sie können jede Windows Store-App-Sprache verwenden, um auf das SDK und Mobile Services zuzugreifen.

Verwaltungs- und Speicheroptionen für Anwendungsdaten

Alle bisher aufgeführten Optionen für die Datenspeicherung und den -zugriff dienen zum Speichern von Inhalten, aber Sie benötigen als Entwickler auch Optionen zum Speichern der Konfigurationsdaten der App. Dies sind keine Benutzerdaten, sondern die Metadaten, die Ihre App oder die Funktionen des Geräts beschreiben. Moderne Apps nutzen sowohl persistente Anwendungsdaten (wie Benutzereinstellungen) als auch temporäre Metadaten (wie die letzte Position des Benutzers beim Blättern oder Trendsuchbegriffe). Diese kleinen, aber effektiven Erleichterungen stellen die bestmögliche Benutzererfahrung sicher und sind daher wichtig für Ihre App.

Während manche dieser Daten auf das Gerät gehören, ist auch zu berücksichtigen, dass viele Apps auf mehreren Plattformen und Geräten funktionieren. Häufig ist daher die Zentralisierung und Synchronisierung von Anwendungsdaten mit den Inhaltsdaten in Windows Azure sinnvoll.

Die ApplicationData-Klasse im Windows.Storage-Namespace umfasst eine Reihe von APIs zur Verwaltung von Anwendungsdaten. Der Code entspricht dem folgenden Beispiel:

var localSettings = Windows.Storage.ApplicationData.current.localSettings;
var roamingSettings = Windows.Storage.ApplicationData.current.roamingSettings;

Sie können in den localSettings- oder roamingSettings-Eigenschaften einfache oder komplexe Objekte speichern.

Die Verwendung von lokalen oder servergespeicherten Einstellungen ist die bevorzugte Methode, um mit Konfigurationsdaten zu arbeiten. Technologien wie IndexedDB, Dateien oder SkyDrive sind in der Regel keine guten Optionen für App-Konfigurationsdaten, und SQLite ist hier nur sinnvoll, wenn die App es bereits zum Speichern von Inhalten verwendet. Außerdem ist zu berücksichtigen, was passieren soll, wenn die App offline ist oder ihre Internetverbindung getrennt wird. Mit anderen Worten, einige der Daten müssen zwischengespeichert werden, ohne zu viel Speicherplatz zu beanspruchen.

Inhalt und Konfiguration

Zusammenfassend sollten Sie sich bei der Implementierung einer geeigneten Datenarchitektur nicht auf den begrenzten Speicherplatz auf tragbaren Geräten verlassen. Normalerweise stellt das Hosten von Daten in der Cloud daher eine gute Möglichkeit dar. Aber möglicherweise zählt zu den Anforderungen die Wiederverwendung einer vorhandenen Datenbank. Windows Store-Apps unterstützen eine Vielzahl an strukturierten und BLOB-Speicheranforderungen für Inhalte und Konfiguration.

Wenn Sie eine Windows Store-App erstellen und Hilfe beim Auswählen einer Datenzugriffsstrategie benötigen, empfehle ich Ihnen das Generation App-Programm (bit.ly/W8GenAppDev). Generation App führt Sie in 30 Tagen durch den Prozess des Erstellens einer Windows Store-App (oder Windows Phone-App). Das Programm bietet kostenlose Beratung und Unterstützung hinsichtlich der Technik und des Designs sowie exklusive Tipps und Ressourcen.

Rachel Appel arbeitet als Developer Evangelist bei Microsoft in New York City. Sie kann über ihre Website unter rachelappel.com oder per E-Mail unter rachel.appel@microsoft.com erreicht werden. Sie können auch Rachel Appels aktuelle Neuigkeiten auf Twitter unter twitter.com/rachelappel verfolgen.

Unser Dank gilt den folgenden technischen Experten für die Durchsicht dieses Artikels: Scott Klein und Miriam Wallace