Korzystanie z danych w aplikacji systemu iOS

W przykładzie DataAccess_Adv przedstawiono działającą aplikację, która umożliwia wprowadzanie danych przez użytkownika i operacje CRUD (tworzenie, odczytywanie, 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 iOS:

iOS sample list

iOS sample detail

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

iOS project tree

Natywny kod interfejsu użytkownika dla kontrolek widoków w systemie iOS jest poza zakresem tego dokumentu. Aby uzyskać więcej informacji na temat kontrolek interfejsu użytkownika, zapoznaj się z przewodnikiem Praca z tabelami i komórkami w systemie iOS.

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 iOS renderuje dane inaczej jako UITableView.

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).

W przypadku systemu iOS dołącz plik sqlite do aplikacji i upewnij się, że jest on oznaczony akcją kompilacji: zawartość. Umieść kod w pliku FinishedLaunching , aby skopiować plik do katalogu zapisywalnego przed wywołaniem dowolnych metod danych. Poniższy kod skopiuje istniejącą bazę danych o nazwie data.sqlite tylko wtedy, gdy jeszcze nie istnieje.

// Copy the database across (if it doesn't exist)
var appdir = NSBundle.MainBundle.ResourcePath;
var seedFile = Path.Combine (appdir, "data.sqlite");
if (!File.Exists (Database.DatabaseFilePath))
{
  File.Copy (seedFile, Database.DatabaseFilePath);
}

Każdy kod dostępu do danych (niezależnie od tego, czy ADO.NET, czy przy użyciu SQLite.NET), który zostanie wykonany po zakończeniu tego działania, będzie miał dostęp do wstępnie wypełnionych danych.