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 时,应采取常规预防措施,不要发出无效请求,例如尝试创建已存在的表。 跟踪数据库的结构,以免导致 SqliteException
SQLite 错误表 [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
喜欢的 、INSERT
、UPDATE
DELETE
、 或 SELECT
语句。 可以在 SQLite 网站上阅读 SQLite 支持的 SQL 命令。 SQL 语句在 对象上使用以下三种方法之一 SqliteCommand
运行:
ExecuteNonQuery – 通常用于创建表或插入数据。 某些操作的返回值是受影响的行数,否则为 -1。
ExecuteReader – 当行集合应作为 SqlDataReader
返回时使用。
ExecuteScalar - 检索单个值 (例如聚合) 。
EXECUTENONQUERY
INSERT
、 UPDATE
和 DELETE
语句将返回受影响的行数。 所有其他 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
以下方法显示了 语句中的 SELECT
子WHERE
句。
由于代码正在创建完整的 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 数据访问