Freigeben über


Verwenden von Daten in einer App

Das beispiel DataAccess_Adv zeigt eine funktionierende Anwendung, die Benutzereingaben und CRUD-Datenbankfunktionen (Erstellen, Lesen, Aktualisieren und Löschen) ermöglicht. Die Anwendung besteht aus zwei Bildschirmen: einer Liste und einem Dateneingabeformular. Der gesamte Datenzugriffscode kann in iOS und Android ohne Änderungen wiederverwendbar sein.

Nach dem Hinzufügen einiger Daten sehen die Anwendungsbildschirme unter Android wie folgt aus:

Android-Beispielliste

Android-Beispieldetails für

Das Android-Projekt wird unten gezeigt– der in diesem Abschnitt gezeigte Code ist im Verzeichnis Orm enthalten:

Android-Projektstruktur

Der native UI-Code für die Aktivitäten in Android liegt außerhalb des Gültigkeitsbereichs dieses Dokuments. Weitere Informationen zu den Ui-Steuerelementen finden Sie im Leitfaden zu Android ListViews und Adaptern .

Lesen

Das Beispiel enthält mehrere Lesevorgänge:

  • Lesen der Liste
  • Lesen einzelner Datensätze

Die beiden Methoden in der StockDatabase -Klasse sind:

public IEnumerable<Stock> GetStocks ()
{
    lock (locker) {
        return (from i in Table<Stock> () select i).ToList ();
    }
}
public Stock GetStock (int id)
{
    lock (locker) {
        return Table<Stock>().FirstOrDefault(x => x.Id == id);
    }
}

Android rendert die Daten als ListView.

Erstellen und Aktualisieren

Um den Anwendungscode zu vereinfachen, wird eine einzelne Speichermethode bereitgestellt, die ein Insert- oder Update-Objekt ausführt, je nachdem, ob der PrimaryKey festgelegt wurde. Da die Id Eigenschaft mit einem [PrimaryKey] -Attribut gekennzeichnet ist, sollten Sie sie nicht im Code festlegen. Diese Methode erkennt, ob der Wert zuvor gespeichert wurde (durch Überprüfen der Primärschlüsseleigenschaft) und fügt das Objekt entsprechend ein oder aktualisiert es:

public int SaveStock (Stock item)
{
    lock (locker) {
        if (item.Id != 0) {
            Update (item);
            return item.Id;
    } else {
            return Insert (item);
        }
    }
}

Reale Anwendungen erfordern in der Regel eine überprüfung (z. B. erforderliche Felder, Mindestlängen oder andere Geschäftsregeln). Gute plattformübergreifende Anwendungen implementieren so viel logische Validierung wie möglich in freigegebenem Code und übergeben Validierungsfehler zur Anzeige gemäß den Funktionen der Plattform an die Benutzeroberfläche.

Löschen

Im Gegensatz zu den Insert Methoden und Update kann die Delete<T> -Methode nur den Primärschlüsselwert und nicht ein vollständiges Stock -Objekt akzeptieren. In diesem Beispiel wird ein Stock -Objekt an die -Methode übergeben, aber nur die Id-Eigenschaft wird an die Delete<T> -Methode übergeben.

public int DeleteStock(Stock stock)
{
    lock (locker) {
        return Delete<Stock> (stock.Id);
    }
}

Verwenden einer vorab aufgefüllten SQLite-Datenbankdatei

Einige Anwendungen werden mit einer Datenbank ausgeliefert, die bereits mit Daten aufgefüllt ist. Sie können dies ganz einfach in Ihrer mobilen Anwendung erreichen, indem Sie eine vorhandene SQLite-Datenbankdatei mit Ihrer App senden und in ein schreibbares Verzeichnis kopieren, bevor Sie darauf zugreifen. Da SQLite ein Standarddateiformat ist, das auf vielen Plattformen verwendet wird, stehen eine Reihe von Tools zum Erstellen einer SQLite-Datenbankdatei zur Verfügung:

  • SQLite Manager Firefox-Erweiterung – Funktioniert unter Mac und Windows und erzeugt Dateien, die mit iOS und Android kompatibel sind.

  • Befehlszeile : Siehe www.sqlite.org/sqlite.html .

Achten Sie beim Erstellen einer Datenbankdatei für die Verteilung mit Ihrer App auf die Benennung von Tabellen und Spalten, um sicherzustellen, dass sie den Erwartungen Ihres Codes entsprechen, insbesondere wenn Sie SQLite.NET verwenden, der erwartet, dass die Namen Ihren C#-Klassen und -Eigenschaften (oder den zugeordneten benutzerdefinierten Attributen) entsprechen.

Um sicherzustellen, dass code vor allem in Ihrer Android-App ausgeführt wird, können Sie ihn in der ersten zu ladenden Aktivität platzieren, oder Sie können eine Application Unterklasse erstellen, die vor aktivitäten geladen wird. Der folgende Code zeigt eine Application Unterklasse, die eine vorhandene Datenbankdatei data.sqlite aus dem Verzeichnis /Resources/Raw/ kopiert.

[Application]
public class YourAndroidApp : Application {
    public override void OnCreate ()
    {
        base.OnCreate ();
        var docFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
        Console.WriteLine ("Data path:" + Database.DatabaseFilePath);
        var dbFile = Path.Combine(docFolder, "data.sqlite"); // FILE NAME TO USE WHEN COPIED
        if (!System.IO.File.Exists(dbFile)) {
            var s = Resources.OpenRawResource(Resource.Raw.data);  // DATA FILE RESOURCE ID
            FileStream writeStream = new FileStream(dbFile, FileMode.OpenOrCreate, FileAccess.Write);
            ReadWriteStream(s, writeStream);
        }
    }
    // readStream is the stream you need to read
    // writeStream is the stream you want to write to
    private void ReadWriteStream(Stream readStream, Stream writeStream)
    {
        int Length = 256;
        Byte[] buffer = new Byte[Length];
        int bytesRead = readStream.Read(buffer, 0, Length);
        // write the required bytes
        while (bytesRead > 0)
        {
            writeStream.Write(buffer, 0, bytesRead);
            bytesRead = readStream.Read(buffer, 0, Length);
        }
        readStream.Close();
        writeStream.Close();
    }
}