using Mono.Data.Sqlite; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using DevelopEngine; /// /// 数据库管理类 在DBAccess工具类的基础上进一步封装适用本项目的数据库操作逻辑 /// public class DBManager :Singleton { DBAccess sqlDB; SqliteDataReader sqlReader; /// /// 文件路径 /// /// public void InitDBManager(string path) { sqlDB = new DBAccess($"Data Source = {path}"); } //断开连接 public void CloseSqlConnectionDB() { sqlDB?.CloseSqlConnectionDB(); } //创建数据库表 public void CreatTable(string tableName, string[] col, string[] colType) { sqlDB.CreatTable(tableName, col, colType); } #region Demo public void CreatTableDemo() { sqlDB.CreatTable("TeacherTable", new string[] { "Name", "Subject", "StudentCounts", "PassCount" }, new string[] { "TEXT", "TEXT", "INTEGER", "INTEGER" }); //sqlDB.CreatTable("RecordTable", new string[] { "'StudentName'", "'Date'", "'Duration'", "'TeacherName'","'Number'","'Result'" }, new string[] { "TEXT", "DATE TIME", "TEXT", "TEXT","TEXT", "TEXT" }); //sqlDB.CreatTable("DataTable", new string[] { "'Date'", "'DataBytes'"}, new string[] { "DATE TIME", "BLOB" });//创建数据记录存储表 } public void InsterDemo(string stname, string sex, string className, string stnumber, string stYear, string stZY, string teach, string phone) { sqlDB.InsterInto("StMessTable", new string[] { stname, sex, className, stnumber, stYear, stZY, teach, phone }); } public void UpdateDemo(string stname, string sex, string className, string stnumber, string stYear, string stZY, string teach, string phone,string oldNumber) { sqlDB.UpdateValues("StMessTable", new string[] { "Name", "Sex", "Class", "Number", "Year", "College", "Teacher", "Phone" }, new string[] { "'" + stname + "'", "'" + sex + "'", "'" + className + "'", "'" + stnumber + "'", "'" + stYear + "'", "'" + stZY + "'", "'" + teach + "'", "'" + phone + "'" }, "Number", "=", "'" + oldNumber + "'"); } /// /// 按姓名和时间查找 /// /// /// /// public RecordClassDemo[] EnquireRecordDemo(string name, string startTime, string finishTime) { sqlReader = sqlDB.SelectDataAndName("RecordTable", "Date", "'" + startTime + " 00:00:00'", "'" + finishTime + " 23:59:59'", "StudentName", "'" + name + "'"); return GetMessDemo(sqlReader); } RecordClassDemo[] GetMessDemo(SqliteDataReader reader) { List message = new List(); while (reader.Read()) { RecordClassDemo oneMessage = new RecordClassDemo(); if (!reader.IsDBNull(sqlReader.GetOrdinal("User"))) oneMessage.user = reader.GetString(sqlReader.GetOrdinal("User")); if (!reader.IsDBNull(sqlReader.GetOrdinal("StudentName"))) oneMessage.msg = reader.GetString(sqlReader.GetOrdinal("Msg")); message.Add(oneMessage); } return message.ToArray(); } #endregion #region //历史数据操作 /// /// 插入一条学员学习记录 不允许插入重复的数据 重复判定依据为 user+date /// internal bool InsterResultMsg(OperaterRecording operater) { string key = $"{operater.user}:{operater.date}";//学员+日期组成唯一键 sqlReader = sqlDB.Select("LearnRecordTable", "Key", key); if (!sqlReader.HasRows) { byte[] bytes = BytesHelper.ClassToBytes(operater); string sql = "INSERT INTO LearnRecordTable(Key, RecordData) values (@Key, @RecordData)"; SqliteParameter[] parameters = new SqliteParameter[] { new SqliteParameter ("@Key", key), new SqliteParameter ("@RecordData", bytes) }; sqlDB.ExecuteQuery(parameters, sql); return true; } return false; } /// /// 查询所有的记录数据 /// /// public OperaterRecording[] GetAllResultMsg() { sqlReader = sqlDB.GetAllLineMess("LearnRecordTable", "RecordData"); return GetRecording(); } /// /// 按姓名查找记录 /// /// public OperaterRecording[] EnquireRecord(string user) { sqlReader = sqlDB.Select("LearnRecordTable", "User", user); return GetRecording(); } /// /// 删除数据 /// internal bool DeleteRecord(OperaterRecording operater) { string key = $"{operater.user}:{operater.date}";//学员+日期组成唯一键 return sqlDB.DeleteValuesAND("LearnRecordTable", new string[] { "Key" }, new string[] { "=" }, new string[] { $"'{key}'" }); } /// /// 按姓名和时间查找记录 /// /// /// /// public OperaterRecording[] EnquireRecord(string userName, string startTime, string finishTime) { sqlReader = sqlDB.SelectDataAndName("LearnRecordTable", "Date", startTime + " 00:00:00", finishTime + " 23:59:59", "StudentName", userName); return GetRecording(); } //读取完成后解析记录数据 private OperaterRecording[] GetRecording() { if (!sqlReader.HasRows) return null; List operaters = new List(); while (sqlReader.Read()) { OperaterRecording oneMessage = new OperaterRecording(); byte[] buffer = new byte[8192];//数据最大长度不超过8192 long bytesRead = sqlReader.GetBytes(sqlReader.GetOrdinal("RecordData"), 0, buffer, 0, buffer.Length); byte[] actualRead = new byte[bytesRead]; Array.Copy(buffer, 0, actualRead, 0, (int)bytesRead); oneMessage = BytesHelper.BytesToClass(actualRead); operaters.Add(oneMessage); } return operaters.ToArray(); } #endregion #region //AB包资源相关操作 /// /// 删除AB包数据 /// /// internal void DeleteABMsg(string currentMsg) { sqlDB.DeleteValuesAND("AssetBundle", new string[] { "Name" }, new string[] { "=" }, new string[] { $"'{currentMsg}'" }); } AssetBundleMsg[] GetABMsg(SqliteDataReader sqlReader) { List abs = new List(); while (sqlReader.Read()) { AssetBundleMsg oneMsg = new AssetBundleMsg(); oneMsg.assetsName = sqlReader.GetString(sqlReader.GetOrdinal("Name")); oneMsg.type = (ABType)sqlReader.GetInt32(sqlReader.GetOrdinal("Type")); oneMsg.filePath = sqlReader.GetString(sqlReader.GetOrdinal("FilePath")); oneMsg.parentName = sqlReader.GetString(sqlReader.GetOrdinal("ParentName")); abs.Add(oneMsg); } return abs.ToArray(); } string[] GetNames(SqliteDataReader reader) { List names = new List(); while (reader.Read()) { string oneName = null; if (!reader.IsDBNull(sqlReader.GetOrdinal("Name"))) oneName = reader.GetString(sqlReader.GetOrdinal("Name")); if (!string.IsNullOrEmpty(oneName)) names.Add(oneName); } return names.ToArray(); } //插入新数据时 判断是否存在已有数据 若存在则更新 避免出现添加多个同装备的情况 internal void InsterABMsg(AssetBundleMsg currentMsg) { sqlReader = sqlDB.Select("AssetBundle", "Name", currentMsg.assetsName); if (sqlReader.HasRows) { UpdateABMsg(currentMsg); } else sqlDB.InsterInto("AssetBundle", new string[] { currentMsg.assetsName, ((int)currentMsg.type).ToString(), currentMsg.filePath, currentMsg.parentName }); } void UpdateABMsg(AssetBundleMsg currentMsg) { sqlDB.UpdateValues("AssetBundle", new string[] { "Type","FilePath", "ParentName" },new string[] {((int)currentMsg.type).ToString(),currentMsg.filePath,currentMsg.parentName },"Name","=", currentMsg.assetsName); } public string[] GetABNames(ABType aBType) { sqlReader = sqlDB.Select("AssetBundle", "Type", ((int)aBType).ToString()); return GetNames(sqlReader); } //获取车载装备和车辆配置关系 key 车辆 value车载装备 public XDictionary GetOnBoardEquip() { sqlReader = sqlDB.Select("AssetBundle", "Type", ((int) ABType.工具).ToString()); XDictionary pairs = new XDictionary(); while (sqlReader.Read()) { string equipName = null; if (!sqlReader.IsDBNull(sqlReader.GetOrdinal("Name"))) equipName = sqlReader.GetString(sqlReader.GetOrdinal("Name")); if (!sqlReader.IsDBNull(sqlReader.GetOrdinal("ParentName"))) pairs[sqlReader.GetString(sqlReader.GetOrdinal("ParentName"))]= equipName; } return pairs; } public AssetBundleMsg[] GetABMsg() { sqlReader = sqlDB.ReaderFullTable("AssetBundle"); return GetABMsg(sqlReader); } #endregion #region 用户数据相关操作 //用户登录查询 public bool CheckUserLogin(User user) { sqlReader = sqlDB.Select(GetUserTable(user.userType), new string[] { "user" }, new string[] { "user", "password" }, new string[] { user.user, user.password }); return !sqlReader.IsDBNull(sqlReader.GetOrdinal("user"));//能查询到该用户 } //添加用户 public bool InsterUser(User userMsg) { sqlReader = sqlDB.Select(GetUserTable(userMsg.userType), "user", userMsg.user); if(!sqlReader.HasRows)//查询 避免重复插入输入 { sqlDB.InsterInto(GetUserTable(userMsg.userType), new string[] {userMsg.user,userMsg.password}); return true; } return false; } //查找所有用户 public User[] GetAllUser(UserType userType) { sqlReader = sqlDB.ReaderFullTable(GetUserTable(userType)); List userLis = new List(); while (sqlReader.Read()) { User oneMessage = new User(); if (!sqlReader.IsDBNull(sqlReader.GetOrdinal("user"))) oneMessage.user = sqlReader.GetString(sqlReader.GetOrdinal("user")); if (!sqlReader.IsDBNull(sqlReader.GetOrdinal("password"))) oneMessage.password = sqlReader.GetString(sqlReader.GetOrdinal("password")); oneMessage.userType = userType; userLis.Add(oneMessage); } return userLis.ToArray(); } //删除用户 public void DeleteUser(User user) { sqlDB.DeleteValuesAND(GetUserTable(user.userType), new string[] { "user" }, new string[] { "=" }, new string[] { $"'{user.user}'" }); } //更新用户密码 public void UpdateUser(User user) { sqlDB.UpdateValues(GetUserTable(user.userType), new string[] { "user", "password" }, new string[] {user.user,user.password }, "user", "=", user.user); } /// /// 根据用户类型获取 数据库表名称 /// /// /// private string GetUserTable(UserType user) { string tableName = ""; switch (user) { case UserType.student: tableName = "StudentUser"; break; case UserType.Teacher: tableName = "TeacherUser"; break; default: break; } return tableName; } #endregion } //成功插入一条数据时返回的操作类型 //用于某些带有唯一标识且可能重复插入数据的表单 public enum InsterType { /// /// 新数据 /// newData, /// /// 覆盖一条原有数据 /// overwrite, }