Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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:
Projekt systemu Android jest pokazany poniżej — kod przedstawiony w tej sekcji znajduje się w katalogu Orm :
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();
}
}