Sdílet prostřednictvím


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 TABLEINSERT 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.DataMono.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.

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

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

  3. 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:

iOS ADO.NET sample

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:

  1. Vytvoření souboru databáze
  2. Vložení některých dat
  3. 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();