相关文章推荐
飞翔的小刀  ·  WPF ...·  4 月前    · 
含蓄的斑马  ·  warning LNK4099: PDB ...·  1 年前    · 
爱旅游的手套  ·  【我要做开源】Vue ...·  1 年前    · 

Xamarin 内置了对 ANDROID 上提供的 SQLite 数据库的支持,可以使用熟悉的类似 ADO.NET 语法公开。 使用这些 API 需要编写由 SQLite 处理的 SQL 语句,例如 CREATE TABLE INSERT SELECT 语句。

程序集引用

若要通过 ADO.NET 使用 access SQLite,必须添加 System.Data Mono.Data.Sqlite 对 Android 项目的引用,如下所示:

Visual Studio Visual Studio for Mac

右键单击“ 引用 > ”“编辑引用...” ,然后单击以选择所需的程序集。

关于 Mono.Data.Sqlite

我们将使用 Mono.Data.Sqlite.SqliteConnection 类创建一个空白数据库文件,然后实例化 SqliteCommand 可用于对数据库执行 SQL 指令的对象。

创建空白数据库 – 使用有效 ((即可写) 文件路径)调用 CreateFile 方法。 在调用此方法之前,应检查该文件是否已存在,否则会在旧数据库顶部创建一个新的 (空白) 数据库,并且旧文件中的数据将丢失。 Mono.Data.Sqlite.SqliteConnection.CreateFile (dbPath); dbPath 应根据本文档前面讨论的规则确定变量。

创建数据库连接 – 创建 SQLite 数据库文件后,可以创建连接对象来访问数据。 连接是使用采用 格式的连接字符串构造的 Data Source=file_path ,如下所示:

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

如前所述,不应在不同的线程之间重用连接。 如有疑问,请根据需要创建连接并在完成后将其关闭;但请注意,这样做的频率也超过要求。

创建和执行数据库命令 – 建立连接后,我们可以对其执行任意 SQL 命令。 下面的代码显示了 CREATE TABLE 正在执行的语句。

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

直接对数据库执行 SQL 时,应采取常规预防措施,不要发出无效请求,例如尝试创建已存在的表。 跟踪数据库的结构,以免导致 SqliteExceptionSQLite 错误表 [Items] 已存在

基本数据访问

在 Android 上运行时,本文档 DataAccess_Basic 示例代码如下所示:

下面的代码演示了如何执行简单的 SQLite 操作,并在应用程序的main窗口中以文本的形式显示结果。

需要包含以下命名空间:

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

以下代码示例演示了整个数据库交互:

  • 创建数据库文件
  • 插入一些数据
  • 这些操作通常出现在代码中的多个位置,例如,在应用程序首次启动时,可以创建数据库文件和表,并在应用中的各个屏幕中执行数据读取和写入。 在以下示例中,已分组为此示例的单个方法:

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

    更复杂的查询

    由于 SQLite 允许对数据运行任意 SQL 命令,因此可以执行任何CREATE喜欢的 、INSERTUPDATEDELETE、 或 SELECT 语句。 可以在 SQLite 网站上阅读 SQLite 支持的 SQL 命令。 SQL 语句在 对象上使用以下三种方法之一 SqliteCommand 运行:

  • ExecuteNonQuery – 通常用于创建表或插入数据。 某些操作的返回值是受影响的行数,否则为 -1。

  • ExecuteReader – 当行集合应作为 SqlDataReader返回时使用。

  • ExecuteScalar - 检索单个值 (例如聚合) 。

    EXECUTENONQUERY

    INSERTUPDATEDELETE 语句将返回受影响的行数。 所有其他 SQL 语句将返回 -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

    以下方法显示了 语句中的 SELECTWHERE句。 由于代码正在创建完整的 SQL 语句,因此它必须小心转义保留字符,例如引号 (字符串周围的) 。

    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 对象。 除了 Read 示例中显示的 方法外,其他有用的属性包括:

  • RowsAffected – 受查询影响的行计数。

  • HasRows – 是否返回了任何行。

    EXECUTESCALAR

    对于 SELECT 返回单个值 ((例如聚合) )的语句,请使用此方法。

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

    方法 ExecuteScalar 的返回类型为 object - 应根据数据库查询强制转换结果。 结果可以是查询中的 COUNT 整数,也可以是单列 SELECT 查询中的字符串。 请注意,这不同于返回读取器对象或受影响行数计数的其他 Execute 方法。

  • DataAccess Basic (示例)
  • DataAccess 高级 (示例)
  • Android 数据方案
  • Xamarin.Forms 数据访问
  •