在上一篇《Unity接入SQLite (二):SQL常用命令》介绍了常用的SQL命令,比如连接数据库、创建表、删除表、插入数据、更新数据等。这篇文章是Unity接入SQLite的实战篇,主要包括对于各种SQL命令的封装和示例。
1.介绍SQLite中重要类
与SQLite命令相关的两个类是SqliteConnection和SqliteCommand,下面就是重点简介
SqliteConnection:用于建立和管理与SQLite数据库的连接。它提供了一组方法和属性来打开、关闭、执行SQL命令和事务等操作。使用SqliteConnection,可以连接到SQLite数据库并执行后续的操作。要使用SqliteConnection,您需要先引用Mono.Data.Sqlite命名空间,并通过创建一个SqliteConnection对象来初始化连接字符串。连接字符串包括数据库的位置、名称和其他连接参数。以下是一个使用SqliteConnection连接到SQLite数据库并执行查询的示例:
using Mono.Data.Sqlite;
// 创建连接字符串
string connectionString = "URI=file:example.db";
// 创建SqliteConnection对象
using (var connection = new SqliteConnection(connectionString))
{
// 打开连接
connection.Open();
//执行其他命令
// 关闭连接
connection.Close();
}
SqliteCommand:SqliteCommand是用于执行SQL语句或存储过程的对象。它负责将SQL语句发送到SQLite数据库,并从数据库中检索结果。它可以用来执行任何SQL语句,例如查询、插入、更新、删除等。SqliteCommand还提供了一些方法,如ExecuteNonQuery()用于执行不返回数据集的SQL语句,ExecuteScalar()用于执行返回单个值的SQL语句,ExecuteReader()用于执行返回结果集的SQL语句等。SqliteCommand还可以绑定参数,以便在SQL语句中使用参数化查询,提高安全性和效率。示例如下所示:
// 创建一个新的SQLiteCommand对象
using (var command = new SQLiteCommand(connection))
{
// 设置要执行的SQL语句
command.CommandText = "SELECT * FROM Customers";
// 执行查询语句并获取结果
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
// 处理查询结果
Console.WriteLine($"ID: {reader["Id"]}, Name: {reader["Name"]}");
}
}
}
2.封装SQLite命令
由于各种SQLite命令是进行数据库操作频繁使用的,所以对SQLite的各种命令比如:数据库连接、创建表格、插入数据、更新数据、查询数据等进行封装,可以根据传入的参数进行相应的命令处理,方便后续调用。
1.执行SQL命令
private static SqliteConnection connection;
private static SqliteCommand command;
private static SqliteDataReader dataReader;
/// <summary>
/// 执行sql命令并返回结果
/// </summary>
/// <param name="sql"></param>
/// <returns></returns>
private static SqliteDataReader ExcuteSql(string sqlCmd)
{
//创建命令
command = connection.CreateCommand();
//指定要执行的SQL命令,比如查询、插入、更新或删除等
command.CommandText = sqlCmd;
//ExecuteReader用于执行语句并返回结果的方法
//如果不返回结果可以使用command.ExecuteNonQuery
dataReader = command.ExecuteReader();
return dataReader;
}
2.连接数据库
/// <summary>
/// 连接数据库
/// </summary>
/// <param name="path">数据库路径</param>
public static void OpenSQLiteFile(string path)
{
try
{
//根据数据库路径连接数据库
connection = new SqliteConnection($"URI=file:{path}");
//打开数据库
connection.Open();
Debug.Log("SQLiteFile Open...");
}
catch (System.Exception e)
{
//捕获异常,如果数据库连接失败则捕获异常
Debug.LogError(e.Message);
}
}
3.创建表格
/// <summary>
/// 创建表
/// sqlCmd:CREATE TABLE tableName (column1 datatype1,column2 datatype2,column3 ///datatype3,.....columnN datatypeN)
/// </summary>
/// <param name="tableName"> 表的名称</param>
/// <param name="columns"></param>
/// <param name="columnType">类型</param>
public static void CreateTable(string tableName, string[] columns, string[] columnType)
{
//如果字段名和字段类型长度不一致则不能创建表格
if (columns.Length != columnType.Length)
{
Debug.LogError("Colum's Length != ColumType's Length");
return;
}
StringBuilder cmdSrt = new StringBuilder(20);
//根据参数进行创建表格SQL命令字符串拼接
cmdSrt.Append($"CREATE TABLE {tableName}(");
for (int i = 0; i < columns.Length; i++)
{
if (i > 0)
{
cmdSrt.Append(",");
}
cmdSrt.Append($"{columns[i]} {columnType[i]}");
}
cmdSrt.Append(")");
//执行命令
ExcuteSql(cmdSrt.ToString());
}
4.检查表格是否存在
/// <summary>
/// 检查表是否存在
/// sqlCmd:SELECT COUNT(*) FROM sqlite_master WHERE type ='table' and name=tableName
/// </summary>
public static bool CheckTableExists(string tableName)
{
string sql = $"SELECT COUNT(*) FROM sqlite_master WHERE type ='table' and name='{tableName}';";
//创建命令
command = connection.CreateCommand();
command.CommandText = sql;
//获取返回结果
int count = Convert.ToInt32(command.ExecuteScalar());
//如果结果为1则表示存在该表格
bool isExists = count == 1;
return isExists;
}
5.向表格中插入数据
/// <summary>
/// 向表中插入数据
/// sqlCmd:INSERT INTO tableName VALUES(value1, value2, value3,...valueN)
/// </summary>
/// <param name="tableName"></param>
/// <param name="insertDatas"></param>
public static void InsertTableData(string tableName, string[] insertDatas)
{
if (insertDatas.Length == 0)
{
Debug.LogError("Values's length == 0");
}
StringBuilder cmdSrt = new StringBuilder(20);
//根据参数进行创建表格SQL命令字符串拼接
cmdSrt.Append($"INSERT INTO {tableName} VALUES(");
for (int i = 0; i < insertDatas.Length; i++)
{
if (i > 0)
{
cmdSrt.Append(",");
}
cmdSrt.Append($"'{insertDatas[i].ToString()}'");
}
cmdSrt.Append(")");
//执行插入数据命令
ExcuteSql(cmdSrt.ToString());
}
6.向表格中更新数据
/// <summary>
/// 向表中更新数据
/// sqlCmd:UPDATE tableName SET column1 = value1, column2 = value2...., columnN = valueN
/// </summary>
/// <param name="tableName"></param>
/// <param name="updateDatas"></param>
public static void UpdateTableData(string tableName, string[] updateDatas)
{
if (updateDatas.Length == 0)
Debug.LogError("Values's length == 0");
StringBuilder cmdSrt = new StringBuilder(20);
//根据参数进行创建表格SQL命令字符串拼接
cmdSrt.Append($"UPDATE {tableName} SET ");
for (int i = 0; i < updateDatas.Length; i += 2)
{
if (i > 0)
{
cmdSrt.Append(",");
}
cmdSrt.Append($"'{updateDatas[i]}'='{updateDatas[i + 1]}'");
}
//执行更新数据命令
ExcuteSql(cmdSrt.ToString());
}
7.获取表中所有数据
/// <summary>
/// 获取表中所有的数据
/// sqlCmd:SELECT * FROM tableName
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tableName"></param>
/// <returns></returns>
public static List<Dictionary<string, T>> GetTableAllData<T>(string tableName)
{
List<Dictionary<string, T>> dataList = new List<Dictionary<string, T>>(20);
//查询命令
string sql = $"SELECT * FROM {tableName}";
using (var reader = ExcuteSql(sql))
{
//每条读取数据
while (reader.Read())
{
Dictionary<string, T> dataDic = new Dictionary<string, T>(5);
for (int i = 0; i < reader.FieldCount; i++)
{
//获取名称
string key = reader.GetName(i);
//获取Value
object value = reader.GetValue(i);
dataDic.Add(key, (T)value);
}
dataList.Add(dataDic);
}
}
return dataList;
}