Použití ADO.NET s Xamarin.iOS
Xamarin má integrovanou podporu pro databázi SQLite, která je k dispozici v iOSu a je vystavená pomocí známého ADO. Syntaxe podobná rozhraní NET. Použití těchto rozhraní API vyžaduje, abyste napsali příkazy SQL, které zpracovává rozhraní SQLite, například CREATE TABLE
INSERT
a SELECT
příkazy.
Odkazy na sestavení
Pokud chcete použít přístup ke SQLite prostřednictvím ADO.NET musíte přidat System.Data
Mono.Data.Sqlite
odkazy na projekt iOS, jak je znázorněno zde (ukázky v Visual Studio pro Mac a sadě Visual Studio):
Klikněte pravým tlačítkem myši na Odkazy upravit odkazy > . Potom kliknutím vyberte požadovaná sestavení.
Informace o Mono.Data.Sqlite
Třídu použijeme k vytvoření prázdného databázového Mono.Data.Sqlite.SqliteConnection
souboru a následnému vytvoření instance SqliteCommand
objektů, které můžeme použít ke spuštění pokynů SQL pro databázi.
Vytvoření prázdné databáze – volání
CreateFile
metody s platnou (tj. zapisovatelnou) cestou k souboru. Před voláním této metody byste měli zkontrolovat, jestli soubor již existuje, jinak se v horní části starého souboru vytvoří nová (prázdná) databáze a data ve starém souboru budou ztracena:Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath);
Poznámka:
Proměnná
dbPath
by měla být stanovena podle pravidel probíraných dříve v tomto dokumentu.Vytvoření Připojení ion databáze – po vytvoření databázového souboru SQLite můžete vytvořit objekt připojení pro přístup k datům. Připojení je vytvořené pomocí připojovací řetězec, který má formu
Data Source=file_path
, jak je znázorněno zde:var connection = new SqliteConnection ("Data Source=" + dbPath); connection.Open(); // do stuff connection.Close();
Jak už bylo zmíněno dříve, připojení by se nikdy nemělo znovu používat napříč různými vlákny. Pokud máte pochybnosti, vytvořte připojení podle potřeby a po dokončení ho zavřete; ale mějte na paměti, že to děláte častěji, než je potřeba.
Vytvoření a spuštění databázového příkazu – Jakmile máme připojení, můžeme vůči němu spustit libovolné příkazy SQL. Následující kód ukazuje spuštění příkazu CREATE TABLE.
using (var command = connection.CreateCommand ()) { command.CommandText = "CREATE TABLE [Items] ([_id] int, [Symbol] ntext, [Name] ntext);"; var rowcount = command.ExecuteNonQuery (); }
Při provádění SQL přímo na databázi byste měli provést běžná opatření, která by neměla provádět neplatné požadavky, například při pokusu o vytvoření tabulky, která již existuje. Udržujte přehled o struktuře databáze, abyste nezpůsobili chybu SqliteException, například "Tabulka chyb SQLite [Items] již existuje".
Základní přístup k datům
Ukázkový kód DataAccess_Basic pro tento dokument vypadá při spuštění v iOSu takto:
Následující kód ukazuje, jak provádět jednoduché operace SQLite a zobrazit výsledky jako text v hlavním okně aplikace.
Budete muset zahrnout tyto obory názvů:
using System;
using System.IO;
using Mono.Data.Sqlite;
Následující ukázka kódu ukazuje celou interakci databáze:
- Vytvoření souboru databáze
- Vložení některých dat
- Dotazování na data
Tyto operace se obvykle zobrazí na několika místech v kódu, například při prvním spuštění aplikace a provádění čtení a zápisů dat v jednotlivých obrazovkách v aplikaci můžete vytvořit databázový soubor a tabulky. V následujícím příkladu jsme seskupili do jedné metody pro tento příklad:
public static SqliteConnection connection;
public static string DoSomeDataAccess ()
{
// determine the path for the database file
string dbPath = Path.Combine (
Environment.GetFolderPath (Environment.SpecialFolder.Personal),
"adodemo.db3");
bool exists = File.Exists (dbPath);
if (!exists) {
Console.WriteLine("Creating database");
// Need to create the database before seeding it with some data
Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath);
connection = new SqliteConnection ("Data Source=" + dbPath);
var commands = new[] {
"CREATE TABLE [Items] (_id ntext, Symbol ntext);",
"INSERT INTO [Items] ([_id], [Symbol]) VALUES ('1', 'AAPL')",
"INSERT INTO [Items] ([_id], [Symbol]) VALUES ('2', 'GOOG')",
"INSERT INTO [Items] ([_id], [Symbol]) VALUES ('3', 'MSFT')"
};
// Open the database connection and create table with data
connection.Open ();
foreach (var command in commands) {
using (var c = connection.CreateCommand ()) {
c.CommandText = command;
var rowcount = c.ExecuteNonQuery ();
Console.WriteLine("\tExecuted " + command);
}
}
} else {
Console.WriteLine("Database already exists");
// Open connection to existing database file
connection = new SqliteConnection ("Data Source=" + dbPath);
connection.Open ();
}
// query the database to prove data was inserted!
using (var contents = connection.CreateCommand ()) {
contents.CommandText = "SELECT [_id], [Symbol] from [Items]";
var r = contents.ExecuteReader ();
Console.WriteLine("Reading data");
while (r.Read ())
Console.WriteLine("\tKey={0}; Value={1}",
r ["_id"].ToString (),
r ["Symbol"].ToString ());
}
connection.Close ();
}
Složitější dotazy
Vzhledem k tomu, že SQLite umožňuje spouštět libovolné příkazy SQL s daty, můžete provádět libovolné příkazy CREATE, INSERT, UPDATE, DELETE nebo SELECT, které se vám líbí. O příkazech SQL podporovaných nástrojem SQLite si můžete přečíst na webu Sqlite. Příkazy SQL se spouští pomocí jedné ze tří metod v objektu SqliteCommand:
- ExecuteNonQuery – obvykle se používá k vytvoření tabulky nebo vložení dat. Návratová hodnota některých operací je počet ovlivněných řádků, jinak je to -1.
- ExecuteReader – používá se při vrácení kolekce řádků jako
SqlDataReader
. - ExecuteScalar – načte jednu hodnotu (například agregaci).
EXECUTENONQUERY
Příkazy INSERT, UPDATE a DELETE vrátí počet ovlivněných řádků. Všechny ostatní příkazy SQL vrátí hodnotu -1.
using (var c = connection.CreateCommand ()) {
c.CommandText = "INSERT INTO [Items] ([_id], [Symbol]) VALUES ('1', 'APPL')";
var rowcount = c.ExecuteNonQuery (); // rowcount will be 1
}
EXECUTEREADER
Následující metoda ukazuje klauzuli WHERE v příkazu SELECT. Protože kód vytvoří kompletní příkaz SQL, musí se postarat o řídicí rezervované znaky, jako jsou uvozovky (') kolem řetězců.
public static string MoreComplexQuery ()
{
var output = "";
output += "\nComplex query example: ";
string dbPath = Path.Combine (
Environment.GetFolderPath (Environment.SpecialFolder.Personal), "ormdemo.db3");
connection = new SqliteConnection ("Data Source=" + dbPath);
connection.Open ();
using (var contents = connection.CreateCommand ()) {
contents.CommandText = "SELECT * FROM [Items] WHERE Symbol = 'MSFT'";
var r = contents.ExecuteReader ();
output += "\nReading data";
while (r.Read ())
output += String.Format ("\n\tKey={0}; Value={1}",
r ["_id"].ToString (),
r ["Symbol"].ToString ());
}
connection.Close ();
return output;
}
ExecuteReader metoda vrátí SqliteDataReader objektu. Kromě metody Read zobrazené v příkladu zahrnují i další užitečné vlastnosti:
- RowsAffected – Počet řádků ovlivněných dotazem.
- HasRows – zda byly vráceny nějaké řádky .
EXECUTESCALAR
Tuto možnost použijte pro příkazy SELECT, které vrací jednu hodnotu (například agregaci).
using (var contents = connection.CreateCommand ()) {
contents.CommandText = "SELECT COUNT(*) FROM [Items] WHERE Symbol <> 'MSFT'";
var i = contents.ExecuteScalar ();
}
Návratový ExecuteScalar
typ metody je object
– výsledek byste měli přetypovat v závislosti na databázovém dotazu. Výsledkem může být celé číslo z dotazu COUNT nebo řetězce z jednoho sloupce select dotazu. Všimněte si, že se to liší od jiných metod Execute, které vracejí objekt čtenáře nebo počet ovlivněných řádků.
Microsoft.Data.Sqlite
Existuje další knihovna Microsoft.Data.Sqlite
, která se dá nainstalovat z NuGetu, která je funkčně ekvivalentní Mono.Data.Sqlite
a umožňuje stejné typy dotazů.
Existují porovnání mezi dvěma knihovnami a některými podrobnostmi specifickými pro Xamarin. Nejdůležitější pro aplikace Xamarin.iOS musíte zahrnout volání inicializace:
// required for Xamarin.iOS
SQLitePCL.Batteries_V2.Init();