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,
}