在上一篇《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;/// /// 执行sql命令并返回结果/// /// /// private static SqliteDataReader ExcuteSql(string sqlCmd){//创建命令command = connection.CreateCommand();//指定要执行的SQL命令,比如查询、插入、更新或删除等command.CommandText = sqlCmd;//ExecuteReader用于执行语句并返回结果的方法//如果不返回结果可以使用command.ExecuteNonQuerydataReader = command.ExecuteReader();return dataReader;}

2.连接数据库

/// /// 连接数据库/// /// 数据库路径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.创建表格

/// /// 创建表/// sqlCmd:CREATE TABLE tableName (column1 datatype1,column2 datatype2,column3 ///datatype3,.....columnN datatypeN)/// ///  表的名称/// /// 类型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  0){ cmdSrt.Append(",");}cmdSrt.Append($"{columns[i]} {columnType[i]}"); } cmdSrt.Append(")"); //执行命令 ExcuteSql(cmdSrt.ToString());}

4.检查表格是否存在

/// /// 检查表是否存在/// sqlCmd:SELECT COUNT(*) FROM sqlite_master WHERE type ='table' and name=tableName/// 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.向表格中插入数据

/// /// 向表中插入数据/// sqlCmd:INSERT INTO tableName VALUES(value1, value2, value3,...valueN)/// /// /// 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  0){cmdSrt.Append(",");}cmdSrt.Append($"'{insertDatas[i].ToString()}'");}cmdSrt.Append(")");//执行插入数据命令ExcuteSql(cmdSrt.ToString());}

6.向表格中更新数据

/// /// 向表中更新数据/// sqlCmd:UPDATE tableName SET column1 = value1, column2 = value2...., columnN = valueN/// /// /// 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  0){cmdSrt.Append(",");}cmdSrt.Append($"'{updateDatas[i]}'='{updateDatas[i + 1]}'");}//执行更新数据命令ExcuteSql(cmdSrt.ToString());}

7.获取表中所有数据

/// /// 获取表中所有的数据 /// sqlCmd:SELECT * FROM tableName/// /// /// /// public static List<Dictionary> GetTableAllData(string tableName){List<Dictionary> dataList = new List<Dictionary>(20);//查询命令string sql = $"SELECT * FROM {tableName}";using (var reader = ExcuteSql(sql)){//每条读取数据while (reader.Read()){Dictionary dataDic = new Dictionary(5);for (int i = 0; i < reader.FieldCount; i++){//获取名称string key = reader.GetName(i);//获取Valueobject value = reader.GetValue(i);dataDic.Add(key, (T)value);}dataList.Add(dataDic);}}return dataList;}