看完这两篇呢,基本上对sqlite数据库的使用都没有问题了,但是想在Unity中更方便的使用,我有对两者进行了改进和升级。
首先,先来看下基本的sqliteManager,对sqlite的基本操作工具类:
using UnityEngine; using System.Collections.Generic; using Mono.Data.sqlite; public class sqlManager : MonoBehavIoUr { private const string dbName = "QikuEdu"; //链接数据库 private sqliteConnection connection; //数据库命令 private sqliteCommand command; //数据库阅读器 private sqliteDataReader reader; private static sqlManager _instance = null; public static sqlManager Instance { get { if (_instance == null) { GameObject obj = new GameObject(); _instance = obj.AddComponent<sqlManager>(); } return _instance; } } void Awake() { if(null == _instance){ _instance = this; }else{ GameObject.Destroy(this); return; } //初始化,打开数据库 OpenDB(dbName); } //public sqlManager() { } ////必须有参数的构造方法 //public sqlManager(string dbName) //{ // OpenDB(dbName); //} public void OpenDB(string dbName) { try { //链接数据库操作 string dbPath = Application.streamingAssetsPath + "/" + dbName + ".db"; //固定sqlite格式data source connection = new sqliteConnection(@"Data Source = " + dbPath); connection.Open(); Debug.Log("DataBase Connect"); } catch (System.Exception e) { Debug.LogError(e.ToString()); } } public void CloseDB() { /* * IDispose接口可以通过Using(){}关键字实现使用后立刻销毁 * Close ()方法回滚任何挂起的事务。然后,它将连接释放到连接池,或者在连接池被禁用的情况下关闭连接, * 应用程序可以多次调用 Close。不会生成任何异常。 * Dispose()方法实际是和close()做的同一件事,唯一的区别是Dispose方法清空了connectionString,即设置为了null. */ if (reader != null) reader.Close(); if (command != null) command.Dispose(); if (connection != null) connection.Close(); Debug.Log("DataBase Close"); } //创建数据库表 public void CreateTabel(string _tableName,string[] col,string[] colType) { //string createsql = "CREATE TABLE player(ID int,name text,damage int)"; if (col.Length != colType.Length) { Debug.LogError("Colum's Length != ColumType's Length"); return; } string sql = "CREATE TABLE "+_tableName+"("; for(int i=0;i<col.Length;i++) { sql += col[i] + " " + colType[i] + ","; } sql = sql.TrimEnd(','); sql += ")"; Excutesql(sql); } //插入数据 public void Insert(string _tableName,object[] values) { //string createsql = "INSERT INTO player(ID,name,damage) VALUES (102,'ak47',120)"; if (values.Length == 0) Debug.LogError("Values's length == 0"); string sql = "INSERT INTO "+_tableName + " VALUES("; foreach(object value in values) { sql += "'" + value.ToString() + "'" +",'); sql += ")"; Excutesql(sql); } //删除数据 OR public void DeleteOR(string _tabelName,params object[] colums) { //string createsql = "delete from player where rowid=1"; if (colums == null || colums.Length == 0) Debug.LogError("colums == null || colums.Length == 0"); string sql = "DELETE FROM " + _tabelName + " WHERE "; for (int i = 0; i < colums.Length; i += 2) { sql += colums[i] + " = '" + colums[i + 1].ToString() + "' OR "; } sql = sql.Remove(sql.Length - 3); Excutesql(sql); } //删除数据 AND public void DeleteAND(string _tabelName,params object[] colums) { if (colums == null || colums.Length == 0) Debug.LogError("colums == null || colums.Length == 0"); string sql = "DELETE FROM " + _tabelName + " WHERE "; for (int i=0;i<colums.Length;i+=2) { sql += colums[i] + " = '" + colums[i+1].ToString() + "' AND "; } sql = sql.Remove(sql.Length - 4); Excutesql(sql); } //更新数据 OR public void UpdateOR(string _tableNmae,object[] colums,params object[] options) { //string createsql = "Update player set name='M16' where id=102"; if (colums == null || colums.Length == 0 || colums.Length % 2 == 1) Debug.LogError("colums Length has error!!!"); if (options == null || options.Length == 0 || options.Length % 2 == 1) Debug.LogError("options Length has error!!!"); string sql = "UPDATE " + _tableNmae + " SET "; for (int i = 0; i < colums.Length; i += 2) { sql += colums[i] + " = '" + colums[i + 1].ToString() + "' "; } sql += " WHERE "; for (int i = 0; i < options.Length; i+=2) { sql += options[i] + "=" + options[i+1].ToString() + " OR "; } sql = sql.Remove(sql.Length - 3); Excutesql(sql); } //更新数据 AND public void UpdateAND(string _tableNmae,params object[] options) { //string createsql = "Update player set name='M16' where id=102"; if (colums == null || colums.Length == 0 || colums.Length % 2 == 1) Debug.LogError("colums Length has error!!!"); if (options == null || options.Length == 0 || options.Length % 2 == 1) Debug.LogError("options Length has error!!!"); string sql = "UPDATE " + _tableNmae + " SET "; for (int i = 0; i < colums.Length; i += 2) { sql += colums[i] + " = '" + colums[i + 1].ToString() + "' "; } sql += " WHERE "; for (int i = 0; i < options.Length; i += 2) { sql += options[i] + "=" + options[i + 1].ToString() + " AND "; } sql = sql.Remove(sql.Length - 4); Excutesql(sql); } //查询制定列名的整张表(老方法) //public List<Dictionary<string,object>> Select(string _tableName) //{ // string sql = "SELECT * FROM "+ _tableName; // reader = Excutesql(sql); // List<Dictionary<string,object>> dicArr = new List<Dictionary<string,object>>(); // //阅读电子书,翻页 // while(reader.Read()) // { // //Debug.Log(reader.GetInt32(0) + ":" + reader.GetString(1) + ":" + reader.GetInt32(2)); // //int idex2 = reader.GetOrdinal("rowid"); // Dictionary<string,object> dic = new Dictionary<string,object>(); // dic.Add("ID",reader.GetValue(reader.GetOrdinal("ID"))); // dic.Add("Name",reader.GetValue(reader.GetOrdinal("Name"))); // dic.Add("Damage",reader.GetValue(reader.GetOrdinal("Damage"))); // dicArr.Add(dic); // } // reader.Close(); // return dicArr; //} ////按照ID查询(ID是主键) //public Dictionary<string,object> SelectByID(string _tableName,int Id) //{ // string sql = "SELECT * FROM " + _tableName +" WHERE Id ="+Id; // reader = Excutesql(sql); // Dictionary<string,object>(); // //阅读电子书,翻页 // reader.Read(); // for (int i = 0; i < reader.FieldCount; i++) // { // dic.Add(reader.GetName(i),reader.GetValue(i)); // } // reader.Close(); // return dic; //} //查找所有 public List<Dictionary<string,object>> SelectAll(string _tableName) { string sql = "SELECT * FROM " + _tableName; List<Dictionary<string,object>> dataArr = new List<Dictionary<string,object>>(); reader = Excutesql(sql); while (reader.Read()) { Dictionary<string,object> data = new Dictionary<string,object>(); for (int i = 0; i < reader.FieldCount; i++) { string key = reader.GetName(i); object value = reader.GetValue(i); data.Add(key,value); } dataArr.Add(data); } return dataArr; } //按照自定义条件查找单条数据 public Dictionary<string,object> SelectWithCondition(string _tableName,params object[] options) { if (options == null || options.Length == 0 || options.Length % 2 == 1) Debug.LogError("options Length has error!!!"); string sql = "SELECT * FROM " + _tableName + " WHERE "; Dictionary<string,object>(); for(int i=0;i< options.Length;i+=2) { sql += options[i] + "= '" + options[i + 1]+"' AND "; } sql = sql.Remove(sql.Length-4); reader = Excutesql(sql); reader.Read(); for(int i=0;i<reader.FieldCount;i++) { string key = reader.GetName(i); object value = reader.GetValue(i); dic.Add(key,value); } return dic; } //按照自定义条件查找整张表数据 public List<Dictionary<string,object>> SelectAllWithCondition(string _tableName,params object[] options) { if (options == null || options.Length == 0 || options.Length % 2 == 1) Debug.LogError("options Length has error!!!"); string sql = "SELECT * FROM " + _tableName + " WHERE "; List<Dictionary<string,object>>(); for (int i = 0; i < options.Length; i += 2) { sql += options[i] + "= '" + options[i + 1] + "' AND "; } sql = sql.Remove(sql.Length - 4); reader = Excutesql(sql); while (reader.Read()) { Dictionary<string,value); } dataArr.Add(data); } return dataArr; } //执行数据库语句 sqliteDataReader Excutesql(string _sql) { Debug.Log("Excuted sql :" + _sql); //创建数据库连接命令(事务管理、命令管理:向数据库发送指令) command = connection.CreateCommand(); //设置命令语句 command.CommandText = _sql; //执行命令后 返回 阅读器信息 using (reader = command.ExecuteReader()) { return reader; } } }
然后是数据实体类:
using UnityEngine; using System.Collections.Generic; public class sqlDataBase { public virtual sqlDataBase InitWithsqlData(Dictionary<string,object> _data) { return null; } } public class Weapons : sqlDataBase { public int id; public string name; public int damage; public int level; public int color; public static Weapons Copy(Weapons other) { Weapons ret = new Weapons(); ret.id = other.id; ret.name = other.name; ret.damage = other.damage; ret.level = other.level; ret.color = other.color; return ret; } public override sqlDataBase InitWithsqlData(Dictionary<string,object> data) { this.id = System.Convert.ToInt32(data["id"]); this.name = System.Convert.ToString(data["name"]); this.damage = System.Convert.ToInt32(data["damage"]); this.level = System.Convert.ToInt32(data["level"]); this.color = System.Convert.ToInt32(data["color"]); return this; } } public class Player : sqlDataBase { public int id; public string name; public int level; public int hp; public int ep; public int exp; public static Player Copy(Player other) { Player ret = new Player(); ret.id = other.id; ret.name = other.name; ret.level = other.level; ret.hp = other.hp; ret.ep = other.ep; ret.exp = other.exp; return ret; } public override sqlDataBase InitWithsqlData(Dictionary<string,object> data) { this.id = System.Convert.ToInt32(data["id"]); this.name = System.Convert.ToString(data["name"]); this.level = System.Convert.ToInt32(data["level"]); this.hp = System.Convert.ToInt32(data["hp"]); this.ep = System.Convert.ToInt32(data["ep"]); this.exp = System.Convert.ToInt32(data["exp"]); return this; } } public class Enemy : sqlDataBase { public int id; public string name; public int level; public int damage; public int hp; public int ep; public int exp; public static Enemy Copy(Enemy other) { Enemy ret = new Enemy(); ret.id = other.id; ret.name = other.name; ret.level = other.level; ret.damage = other.damage; ret.hp = other.hp; ret.ep = other.ep; ret.exp = other.exp; return ret; } public override sqlDataBase InitWithsqlData(Dictionary<string,object> data) { this.id = System.Convert.ToInt32(data["id"]); this.name = System.Convert.ToString(data["name"]); this.level = System.Convert.ToInt32(data["level"]); this.damage = System.Convert.ToInt32(data["damage"]); this.hp = System.Convert.ToInt32(data["hp"]); this.ep = System.Convert.ToInt32(data["ep"]); this.exp = System.Convert.ToInt32(data["exp"]); return this; } }
从sqlite数据库读取出来的数据,转换到可以使用的实体类当中,需要经过一个DAO(Data Access Object)中间工具类
using UnityEngine; using System.Collections.Generic; public class DAO<T> where T :sqlDataBase,new() { public static T GetById(int id) { return GetInfoWithCondition(typeof(T).Name,new object[] { "id",id }); } public static List<T> GetAllInfos() { string tableName = typeof(T).ToString().ToLower(); List<Dictionary<string,object>> resultList = sqlManager.Instance.SelectAll(tableName); if (resultList.Count == 0) { return default(List<T>); } List<T> t = new List<T>(); for (int i = 0; i < resultList.Count; i++) { T tmp = new T(); tmp.InitWithsqlData(resultList[i]); t.Add(tmp); } return t; } public static T GetInfoWithCondition(string tableName,object[] options) { UnityEngine.Assertions.Assert.IsTrue(options.Length % 2 == 0,"[DAO GetInfoFromTable] options error."); Dictionary<string,object> resultList = sqlManager.Instance.SelectWithCondition(tableName,options); T tmp = new T(); tmp.InitWithsqlData(resultList); return tmp; } public static List<T> GetInfosWithCondition(string tableName,"[DAO GetInfoFromTable] options error."); List<Dictionary<string,object>> resultList = sqlManager.Instance.SelectAllWithCondition(tableName,options); if (resultList.Count == 0) { return default(List<T>); } List<T> t = new List<T>(); for (int i = 0; i < resultList.Count; i++) { T tmp = new T(); tmp.InitWithsqlData(resultList[i]); t.Add(tmp); } return t; } }
这样,我们可以直接操作DAO类,获取我们需要的实体类的数据。