Использование ADO.NET с AndroidUsing ADO.NET with Android

Xamarin имеет встроенную поддержку базы данных SQLite, которая доступна на устройствах Android и можно предоставлять через знакомый синтаксис в стиле ADO.NET.Xamarin has built-in support for the SQLite database that is available on Android and can be exposed using familiar ADO.NET-like syntax. С помощью этих API требует написания инструкций SQL, которые обрабатываются SQLite, такие как CREATE TABLE, INSERT и SELECT инструкций.Using these APIs requires you to write SQL statements that are processed by SQLite, such as CREATE TABLE, INSERT and SELECT statements.

Ссылки на сборкиAssembly References

Использование SQLite с помощью ADO.NET, необходимо добавить доступа System.Data и Mono.Data.Sqlite ссылки на проект Android, как показано ниже:To use access SQLite via ADO.NET you must add System.Data and Mono.Data.Sqlite references to your Android project, as shown here:

Щелкните правой кнопкой мыши ссылки > Изменение ссылок... а затем установите необходимые сборки.Right-click References > Edit References... then click to select the required assemblies.

О Mono.Data.SqliteAbout Mono.Data.Sqlite

Мы будем использовать Mono.Data.Sqlite.SqliteConnection класс для создания файла пустую базу данных и затем для создания экземпляра SqliteCommand объектов, мы можно использовать для выполнения инструкций SQL в базе данных.We will use the Mono.Data.Sqlite.SqliteConnection class to create a blank database file and then to instantiate SqliteCommand objects that we can use to execute SQL instructions against the database.

Создание пустой базы данных – вызовите CreateFile метод с допустимый путь к файлу (т. е. записи).Creating a Blank Database – Call the CreateFile method with a valid (i.e. writeable) file path. Стоит ли файл уже существует, перед вызовом этого метода, в противном случае поверх старого, в котором будет создан новый (пустой) базы данных и данных в старый файл, будут потеряны.You should check whether the file already exists before calling this method, otherwise a new (blank) database will be created over the top of the old one, and the data in the old file will be lost. Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath); dbPath Переменной должно определяться в соответствии с правилами, см. выше в этом документе.Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath); The dbPath variable should be determined according the rules discussed earlier in this document.

Создание подключения к базе данных – после создания файла базы данных SQLite, можно создать объект подключения для доступа к данным.Creating a Database Connection – After the SQLite database file has been created you can create a connection object to access the data. Подключение создается с строка подключения, которая принимает форму Data Source=file_path, как показано ниже:The connection is constructed with a connection string which takes the form of Data Source=file_path, as shown here:

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

Как упоминалось ранее, соединение никогда не следует использовать повторно в разных потоках. Если вы сомневаетесь, создать подключение при необходимости и закройте его, когда все будет готово; но нельзя делать это более часто требуется слишком.If in doubt, create the connection as required and close it when you're done; but be mindful of doing this more often than required too.

Создание и выполнение команды базы данных – после соединения мы может выполнять произвольные команды SQL для нее.Creating and Executing a Database Command – Once we have a connection we can execute arbitrary SQL commands against it. В коде ниже показан CREATE TABLE выполняемой инструкции.The code below shows a CREATE TABLE statement being executed.

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

При выполнении SQL непосредственно в базе данных следует принять обычные меры не вносить недопустимых запросов, таких как попытка создать таблицу, которая уже существует.When executing SQL directly against the database you should take the normal precautions not to make invalid requests, such as attempting to create a table that already exists. Хранить список со структурой вашей базы данных, чтобы не вызвать SqliteException например уже существует в таблице ошибок SQLite [элементов].Keep track of the structure of your database so that you don't cause a SqliteException such as SQLite error table [Items] already exists.

Основные данные доступаBasic Data Access

DataAccess_Basic пример кода для этого документа выглядит следующим образом, при работе в Android:The DataAccess_Basic sample code for this document looks like this when running on Android:

Пример Android ADO.NETAndroid ADO.NET sample

В приведенном ниже коде показано, как выполнять простые операции SQLite и отображает результаты в виде текста в главное окно приложения.The code below illustrates how to perform simple SQLite operations and shows the results in as text in the application's main window.

Вам потребуется включить эти пространства имен:You'll need to include these namespaces:

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

В следующем образце кода показано взаимодействие всей базы данных.The following code sample shows an entire database interaction:

  1. Создание файла базы данныхCreating the database file
  2. Вставка данныхInserting some data
  3. Запрос данныхQuerying the data

Эти операции обычно будет в нескольких местах по всему коду, например можно создать файл базы данных и таблиц, при первом запуске приложения и выполнять операции чтения и записи в отдельных экранов в приложении.These operations would typically appear in multiple places throughout your code, for example you may create the database file and tables when your application first starts and perform data reads and writes in individual screens in your app. В следующем примере были сгруппированы в один метод в этом примере:In the example below have been grouped into a single method for this example:

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

Более сложные запросыMore Complex Queries

Так как SQLite допускает произвольные команды SQL, чтобы отправлять к данным, можно выполнять любые CREATE, INSERT, UPDATE, DELETE, или SELECT инструкций, вам нравится.Because SQLite allows arbitrary SQL commands to be run against the data, you can perform whatever CREATE, INSERT, UPDATE, DELETE, or SELECT statements you like. Можно узнать из команды SQL, поддерживаемые SQLite на веб-сайте SQLite.You can read about the SQL commands supported by SQLite at the SQLite website. Инструкции SQL выполняются с помощью одного из трех методов на SqliteCommand объекта:The SQL statements are run using one of three methods on an SqliteCommand object:

  • ExecuteNonQuery – обычно используется для создания или данных вставить таблицы.ExecuteNonQuery – Typically used for table creation or data insertion. Для некоторых операций возвращается число затронутых строк, в противном случае — значение -1.The return value for some operations is the number of rows affected, otherwise it's -1.

  • ExecuteReader – при коллекцию строк, которые должны возвращаться как SqlDataReader.ExecuteReader – Used when a collection of rows should be returned as a SqlDataReader.

  • ExecuteScalar – возвращает одно значение (например статистическое выражение).ExecuteScalar – Retrieves a single value (for example an aggregate).

EXECUTENONQUERYEXECUTENONQUERY

INSERT, UPDATE, и DELETE инструкции возвращает число затронутых строк.INSERT, UPDATE, and DELETE statements will return the number of rows affected. Все другие инструкции SQL возвращает -1.All other SQL statements will return -1.

using (var c = connection.CreateCommand ()) {
    c.CommandText = "INSERT INTO [Items] ([_id], [Symbol]) VALUES ('1', 'APPL')";
    var rowcount = c.ExecuteNonQuery (); // rowcount will be 1
}

EXECUTEREADEREXECUTEREADER

В следующем показан метод WHERE предложение в SELECT инструкции.The following method shows a WHERE clause in the SELECT statement. Так как код является создание полная инструкция SQL она должны уделить особое внимание экранирует зарезервированные символы, такие как кавычки (') вокруг строк.Because the code is crafting a complete SQL statement it must take care to escape reserved characters such as the quote (') around strings.

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 возвращает объект SqliteDataReader.The ExecuteReader method returns a SqliteDataReader object. В дополнение к Read метод, показанный в примере другие полезные свойства включают:In addition to the Read method shown in the example, other useful properties include:

  • RowsAffected – количество строк, затронутых запросом.RowsAffected – Count of the rows affected by the query.

  • HasRows – ли любые строки были возвращены.HasRows – Whether any rows were returned.

EXECUTESCALAREXECUTESCALAR

Используйте это для SELECT инструкций, которые возвращают единственное значение (например, статистическое выражение).Use this for SELECT statements that return a single value (such as an aggregate).

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

ExecuteScalar — Возвращаемый тип метода object – следует привести результат в зависимости от запроса к базе данных.The ExecuteScalar method's return type is object – you should cast the result depending on the database query. Результат может быть целое число от COUNT запрос или строку из одного столбца SELECT запроса.The result could be an integer from a COUNT query or a string from a single column SELECT query. Обратите внимание, что это отличается от других Execute методы, возвращающие объект средства чтения или число затронутых строк.Note that this is different to other Execute methods that return a reader object or a count of the number of rows affected.