在上一篇《Unity接入SQLite (二):SQL常用命令》介绍了常用的SQL命令,比如连接数据库、创建表、删除表、插入数据、更新数据等。这篇文章是Unity接入SQLite的实战篇,主要包括对于各种SQL命令的封装和示例。
与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"]}");
- }
- }
- }
由于各种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
(string tableName) - {
- List<Dictionary<string, T>> dataList = new List
>(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;
- }