Partager via


Utilisation de ADO.NET avec Android

Xamarin prend en charge la base de données SQLite disponible sur Android et peut être exposée à l’aide d’une syntaxe ADO.NET familière. L’utilisation de ces API vous oblige à écrire des instructions SQL qui sont traitées par SQLite, telles que CREATE TABLEles instructions et INSERTSELECT .

Références d'assembly

Pour utiliser l’accès à SQLite via ADO.NET vous devez ajouter et Mono.Data.Sqlite faire System.Data référence à votre projet Android, comme illustré ici :

Cliquez avec le bouton droit sur Références > Modifier les références, puis cliquez sur pour sélectionner les assemblys requis.

À propos de Mono.Data.Sqlite

Nous allons utiliser la Mono.Data.Sqlite.SqliteConnection classe pour créer un fichier de base de données vide, puis pour instancier des SqliteCommand objets que nous pouvons utiliser pour exécuter des instructions SQL sur la base de données.

Création d’une base de données vide : appelez la CreateFile méthode avec un chemin de fichier valide (c’est-à-dire pouvant être écrit). Vous devez case activée si le fichier existe déjà avant d’appeler cette méthode. Sinon, une nouvelle base de données (vide) sera créée par-dessus l’ancienne et les données de l’ancien fichier seront perdues. Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath); La dbPath variable doit être déterminée selon les règles décrites plus haut dans ce document.

Création d’une connexion de base de données : une fois le fichier de base de données SQLite créé, vous pouvez créer un objet de connexion pour accéder aux données. La connexion est construite avec une chaîne de connexion qui prend la forme de Data Source=file_path, comme illustré ici :

var connection = new SqliteConnection ("Data Source=" + dbPath);
connection.Open();
// do stuff
connection.Close();

Comme mentionné précédemment, une connexion ne doit jamais être réutilisée entre différents threads. En cas de doute, créez la connexion en fonction des besoins et fermez-la lorsque vous avez terminé ; mais soyez conscient de le faire plus souvent que nécessaire aussi.

Création et exécution d’une commande de base de données : une fois que nous avons une connexion, nous pouvons exécuter des commandes SQL arbitraires sur celle-ci. Le code ci-dessous montre une CREATE TABLE instruction en cours d’exécution.

using (var command = connection.CreateCommand ()) {
    command.CommandText = "CREATE TABLE [Items] ([_id] int, [Symbol] ntext, [Name] ntext);";
    var rowcount = command.ExecuteNonQuery ();
}

Lorsque vous exécutez SQL directement sur la base de données, vous devez prendre les précautions normales pour ne pas effectuer de requêtes non valides, telles que la tentative de création d’une table qui existe déjà. Effectuez le suivi de la structure de votre base de données afin de ne pas provoquer l’existence d’une SqliteExceptiontable d’erreurs SQLite [Éléments].

Accès aux données de base

L’exemple de code DataAccess_Basic pour ce document ressemble à ceci lors de l’exécution sur Android :

Exemple de ADO.NET Android ADO.NET

Le code ci-dessous montre comment effectuer des opérations SQLite simples et affiche les résultats sous forme de texte dans la fenêtre main de l’application.

Vous devez inclure ces espaces de noms :

using System;
using System.IO;
using Mono.Data.Sqlite;

L’exemple de code suivant montre une interaction de base de données entière :

  1. Création du fichier de base de données
  2. Insertion de données
  3. Interrogation des données

Ces opérations s’affichent généralement à plusieurs endroits dans votre code, par exemple, vous pouvez créer le fichier de base de données et les tables lorsque votre application démarre pour la première fois et effectuer des lectures et des écritures de données dans des écrans individuels dans votre application. Dans l’exemple ci-dessous, ont été regroupés en une seule méthode pour cet exemple :

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

Requêtes plus complexes

Étant donné que SQLite autorise l’exécution de commandes SQL arbitraires sur les données, vous pouvez effectuer les CREATEinstructions , INSERT, UPDATE, DELETEou SELECT de votre choix. Vous pouvez en savoir plus sur les commandes SQL prises en charge par SQLite sur le site web SQLite. Les instructions SQL sont exécutées à l’aide de l’une des trois méthodes sur un SqliteCommand objet :

  • ExecuteNonQuery : généralement utilisé pour la création de tables ou l’insertion de données. La valeur de retour pour certaines opérations est le nombre de lignes affectées, sinon il s’agit de -1.

  • ExecuteReader : utilisé lorsqu’une collection de lignes doit être retournée en tant que SqlDataReader.

  • ExecuteScalar : récupère une valeur unique (par exemple un agrégat).

EXECUTENONQUERY

INSERTles instructions , UPDATEet DELETE retournent le nombre de lignes affectées. Toutes les autres instructions SQL retournent -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

La méthode suivante montre une WHERE clause dans l’instruction SELECT . Étant donné que le code crée une instruction SQL complète, il doit prendre soin d’échapper des caractères réservés tels que le guillemet (') autour des chaînes.

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

La méthode ExecuteReader retourne un objet SqliteDataReader. Outre la Read méthode illustrée dans l’exemple, d’autres propriétés utiles sont les suivantes :

  • RowsAffected : nombre de lignes affectées par la requête.

  • HasRows : indique si des lignes ont été retournées.

EXECUTESCALAR

Utilisez cette option pour SELECT les instructions qui retournent une valeur unique (par exemple, un agrégat).

using (var contents = connection.CreateCommand ()) {
    contents.CommandText = "SELECT COUNT(*) FROM [Items] WHERE Symbol <> 'MSFT'";
    var i = contents.ExecuteScalar ();
}

Le ExecuteScalar type de retour de la méthode est object : vous devez caster le résultat en fonction de la requête de base de données. Le résultat peut être un entier d’une COUNT requête ou une chaîne d’une requête à colonne SELECT unique. Notez que cela est différent des autres Execute méthodes qui retournent un objet lecteur ou un nombre de lignes affectées.