Udostępnij za pośrednictwem


Używanie danych w aplikacji

W przykładzie DataAccess_Adv przedstawiono działającą aplikację, która umożliwia korzystanie z funkcji bazy danych typu user-input i CRUD (Tworzenie, odczyt, aktualizowanie i usuwanie). Aplikacja składa się z dwóch ekranów: listy i formularza wpisu danych. Cały kod dostępu do danych jest wielokrotnego użytku w systemach iOS i Android bez modyfikacji.

Po dodaniu niektórych danych ekrany aplikacji wyglądają następująco w systemie Android:

Android sample list

Android sample detail

Projekt systemu Android jest pokazany poniżej — kod przedstawiony w tej sekcji znajduje się w katalogu Orm :

Android project tree

Natywny kod interfejsu użytkownika działań w systemie Android jest poza zakresem tego dokumentu. Aby uzyskać więcej informacji na temat kontrolek interfejsu użytkownika, zapoznaj się z przewodnikiem Android ListViews and Adapters (Kontrolki interfejsu użytkownika).

Przeczytaj

W przykładzie istnieje kilka operacji odczytu:

  • Odczytywanie listy
  • Odczytywanie poszczególnych rekordów

Dwie metody w StockDatabase klasie to:

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);
    }
}

System Android renderuje dane jako ListView.

Utwórz i aktualizuj

Aby uprościć kod aplikacji, podano pojedynczą metodę zapisywania, która wykonuje wstawianie lub aktualizowanie w zależności od tego, czy klucz podstawowy został ustawiony. Id Ponieważ właściwość jest oznaczona atrybutem[PrimaryKey], nie należy go ustawiać w kodzie. Ta metoda wykryje, czy wartość została wcześniej zapisana (sprawdzając właściwość klucza podstawowego) i odpowiednio wstaw lub zaktualizuje obiekt:

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

Rzeczywiste aplikacje zwykle wymagają weryfikacji (takich jak wymagane pola, minimalne długości lub inne reguły biznesowe). Dobre aplikacje międzyplatformowe implementują jak najwięcej logicznej weryfikacji, jak to możliwe w udostępnionym kodzie, przekazując błędy walidacji z kopii zapasowej do interfejsu użytkownika do wyświetlania zgodnie z możliwościami platformy.

Delete

Insert W przeciwieństwie do metod Delete<T> i Update metoda może akceptować tylko wartość klucza podstawowego, a nie kompletny Stock obiekt. W tym przykładzie Stock obiekt jest przekazywany do metody, ale tylko właściwość Id jest przekazywana Delete<T> do metody.

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

Używanie wstępnie wypełnionego pliku bazy danych SQLite

Niektóre aplikacje są dostarczane z bazą danych już wypełnioną danymi. Można to łatwo osiągnąć w aplikacji mobilnej, wysyłając istniejący plik bazy danych SQLite z aplikacją i kopiując go do zapisywalnego katalogu przed uzyskaniem do niego dostępu. Ponieważ SQLite to standardowy format pliku używany na wielu platformach, istnieje wiele narzędzi dostępnych do utworzenia pliku bazy danych SQLite:

  • SqLite Manager Firefox Extension — działa na komputerach Mac i Windows i tworzy pliki zgodne z systemami iOS i Android.

  • Wiersz polecenia — zobacz www.sqlite.org/sqlite.html .

Podczas tworzenia pliku bazy danych do dystrybucji z aplikacją należy zadbać o nazewnictwo tabel i kolumn, aby upewnić się, że pasują one do oczekiwanego kodu, zwłaszcza jeśli używasz SQLite.NET, które będą oczekiwać, że nazwy będą zgodne z klasami i właściwościami języka C# (lub skojarzonymi atrybutami niestandardowymi).

Aby upewnić się, że niektóre kody są uruchamiane przed wszystkimi elementami w aplikacji systemu Android, możesz umieścić go w pierwszym działaniu, aby załadować lub utworzyć podklasę Application ładowaną przed wszelkimi działaniami. Poniższy kod przedstawia podklasę Application , która kopiuje istniejący plik bazy danych data.sqlite z katalogu /Resources/Raw/ .

[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();
    }
}