326 lines
11 KiB
C#
326 lines
11 KiB
C#
|
/********************************************************************
|
|||
|
文件: SqliteManager.cs
|
|||
|
作者: 梦语
|
|||
|
邮箱: 1982614048@qq.com
|
|||
|
创建时间: 2024/03/29 17:28:19
|
|||
|
最后修改: 梦语
|
|||
|
最后修改时间: 2024/04/03 16:04:51
|
|||
|
功能: sqlite本地数据库管理类(用于存放一些本地数据)
|
|||
|
使用案例:
|
|||
|
SqliteManager.Inst.CreateTable("role", new List<DataBaseColumnTypeData>()
|
|||
|
{
|
|||
|
new DataBaseColumnTypeData(){ columnName = "角色id", columnType = DataBaseColumnType.Int, isAutoInchement = true, isPrimaryKey = true},
|
|||
|
new DataBaseColumnTypeData(){ columnName = "角色名称", columnType = DataBaseColumnType.VarChar, parameter = new List<int>() { 10 }, isNotNull = true},
|
|||
|
new DataBaseColumnTypeData(){ columnName = "等级", columnType = DataBaseColumnType.Int, isNotNull = true},
|
|||
|
});
|
|||
|
|
|||
|
DataBaseManager.Inst.DelectTable("role");
|
|||
|
DataBaseManager.Inst.Update("role", new List<(string, string)>()
|
|||
|
{
|
|||
|
("角色名称", "11"),
|
|||
|
}, new List<DataBaseFitter>() {
|
|||
|
//new DataBaseFitter()
|
|||
|
//{
|
|||
|
// columnName = "角色名称",
|
|||
|
// fitterType = DataBaseFitterType.Equal,
|
|||
|
// fitterValue = "32",
|
|||
|
//},
|
|||
|
new DataBaseFitter()
|
|||
|
{
|
|||
|
columnName = "等级",
|
|||
|
fitterType = DataBaseFitterType.GreaterlEqual,
|
|||
|
fitterValue = "20",
|
|||
|
},
|
|||
|
});
|
|||
|
SqliteManager.Inst.Select("role", new List<DataBaseFitter>()
|
|||
|
{
|
|||
|
new DataBaseFitter()
|
|||
|
{
|
|||
|
columnName = "角色名称",
|
|||
|
fitterType = DataBaseFitterType.Equal,
|
|||
|
fitterValue = "11"
|
|||
|
}
|
|||
|
});
|
|||
|
*********************************************************************/
|
|||
|
using Mono.Data.Sqlite;
|
|||
|
using System;
|
|||
|
using System.Collections.Generic;
|
|||
|
using System.IO;
|
|||
|
using UnityEngine;
|
|||
|
|
|||
|
namespace Ether
|
|||
|
{
|
|||
|
public class SqliteManager : Singleton<SqliteManager>
|
|||
|
{
|
|||
|
private readonly static string dataBaseDirectory = $"{Application.persistentDataPath}/DB"; //数据库文件夹沙盒路径
|
|||
|
private const string dataBaseName = "ether.db"; //数据库名称
|
|||
|
private readonly static string databasePath = $"{dataBaseDirectory}/{dataBaseName}"; // 数据库文件沙盒路径
|
|||
|
private readonly static string streamingAssetsDatabasePath = $"{Application.streamingAssetsPath}/DB/{dataBaseName}"; // streamingAssets数据库文件名称
|
|||
|
|
|||
|
static SqliteConnection connection;//创建一个数据库链接事件对象
|
|||
|
|
|||
|
private SqliteCommand command;
|
|||
|
|
|||
|
private SqliteDataReader reader;
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 数据库链接
|
|||
|
/// </summary>
|
|||
|
public void Connect()
|
|||
|
{
|
|||
|
// 定义数据库连接字符串
|
|||
|
string connectionString = $"URI = file:{databasePath};Version=3;"; //Android:"URI = file:" + Application.dataPath + "test.db";
|
|||
|
|
|||
|
// 创建数据库连接
|
|||
|
//传入创建或者访问SQLITE数据库的路径
|
|||
|
connection = new SqliteConnection(connectionString);
|
|||
|
|
|||
|
//判断沙盒是否有数据库文件,如果没有则将streamingAssets中的数据库文件拷贝过去
|
|||
|
if (File.Exists(databasePath))
|
|||
|
{
|
|||
|
connection?.Open();//打开数据库
|
|||
|
command = connection.CreateCommand();
|
|||
|
Debug.Log("Sqlite数据库链接完毕已打开");
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
if (File.Exists(streamingAssetsDatabasePath))
|
|||
|
{
|
|||
|
if (!Directory.Exists(dataBaseDirectory))
|
|||
|
{
|
|||
|
Directory.CreateDirectory(dataBaseDirectory);
|
|||
|
}
|
|||
|
|
|||
|
try
|
|||
|
{
|
|||
|
File.Copy(streamingAssetsDatabasePath, databasePath);
|
|||
|
Debug.Log("Sqlite数据库文件复制成功!");
|
|||
|
connection?.Open();//打开数据库
|
|||
|
command = connection.CreateCommand();
|
|||
|
Debug.Log("Sqlite数据库链接完毕已打开");
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
Debug.Log("Sqlite数据库文件复制失败:" + ex.Message);
|
|||
|
}
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
Debug.LogError("streamingAssets中Sqlite数据库文件不存在!");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 断开数据库链接
|
|||
|
/// </summary>
|
|||
|
public void DisConnect()
|
|||
|
{
|
|||
|
command?.Dispose();
|
|||
|
command = null;
|
|||
|
connection?.Close();
|
|||
|
Debug.Log("Sqlite数据库链接已关闭");
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 创建表
|
|||
|
/// </summary>
|
|||
|
/// <param name="tableName"></param>
|
|||
|
/// <param name="tableColumnDataList"></param>
|
|||
|
public void CreateTable(string tableName, List<DataBaseColumnTypeData> tableColumnDataList)
|
|||
|
{
|
|||
|
string columnSqlStr = "";
|
|||
|
|
|||
|
for (int i = 0; i < tableColumnDataList.Count; i++)
|
|||
|
{
|
|||
|
if (i == 0)
|
|||
|
{
|
|||
|
columnSqlStr += DataBaseColumnTypeData.FormatColumnType(tableColumnDataList[i]);
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
columnSqlStr += "," + DataBaseColumnTypeData.FormatColumnType(tableColumnDataList[i]);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
string commandStr = $"CREATE TABLE IF NOT EXISTS {tableName}({columnSqlStr}); ";
|
|||
|
Debug.Log("Sqlite创建表Sql:" + commandStr);
|
|||
|
command.CommandText = commandStr;
|
|||
|
command.ExecuteNonQuery();
|
|||
|
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 删除表
|
|||
|
/// </summary>
|
|||
|
/// <param name="tableName"></param>
|
|||
|
public void DropTable(string tableName)
|
|||
|
{
|
|||
|
string commandStr = $"DROP TABLE IF EXISTS {tableName}; ";
|
|||
|
Debug.Log("Sqlite删除表Sql:" + commandStr);
|
|||
|
command.CommandText = commandStr;
|
|||
|
command.ExecuteNonQuery();
|
|||
|
}
|
|||
|
|
|||
|
#region 增
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 增加数据
|
|||
|
/// </summary>
|
|||
|
/// <param name="tableName">表名</param>
|
|||
|
/// <param name="insertDataList">插入数据</param>
|
|||
|
public void Insert(string tableName, List<(string, string)> insertDataList)
|
|||
|
{
|
|||
|
if (insertDataList.Count <= 0)
|
|||
|
{
|
|||
|
Debug.LogError("Sqlite插入表数据为空,请检查数据!");
|
|||
|
return;
|
|||
|
}
|
|||
|
string columnNameList = "";
|
|||
|
string columnValeList = "";
|
|||
|
|
|||
|
for (int i = 0; i < insertDataList.Count; i++)
|
|||
|
{
|
|||
|
if (i == 0)
|
|||
|
{
|
|||
|
columnNameList += insertDataList[i].Item1;
|
|||
|
columnValeList += insertDataList[i].Item2;
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
columnNameList += "," + insertDataList[i].Item1;
|
|||
|
columnValeList += "," + insertDataList[i].Item2;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
string commandStr = $"INSERT INTO {tableName} ({columnNameList}) VALUES ({columnValeList});";
|
|||
|
Debug.Log("Sqlite插入表Sql:" + commandStr);
|
|||
|
command.CommandText = commandStr;
|
|||
|
command.ExecuteNonQuery();
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 删
|
|||
|
/// <summary>
|
|||
|
/// 删除数据
|
|||
|
/// </summary>
|
|||
|
/// <param name="tableName">表名</param>
|
|||
|
/// <param name="fitterList">条件</param>
|
|||
|
public void Delete(string tableName, List<DataBaseFitter> fitterList)
|
|||
|
{
|
|||
|
if (fitterList.Count <= 0)
|
|||
|
{
|
|||
|
Debug.LogError("Sqlite删除表数据为空,请检查数据!");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
string condition = "";
|
|||
|
|
|||
|
for (int i = 0; i < fitterList.Count; i++)
|
|||
|
{
|
|||
|
if (i == 0)
|
|||
|
{
|
|||
|
condition += $"{fitterList[i].columnName} {DataBaseFitter.FormatFitter(fitterList[i].fitterType)} {fitterList[i].fitterValue}";
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
condition += $" AND {fitterList[i].columnName} {DataBaseFitter.FormatFitter(fitterList[i].fitterType)} {fitterList[i].fitterValue}";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
string commandStr = $"DELETE FROM {tableName} WHERE {condition};";
|
|||
|
Debug.Log("Sqlite删除表记录Sql:" + commandStr);
|
|||
|
command.CommandText = commandStr;
|
|||
|
command.ExecuteNonQuery();
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 改
|
|||
|
|
|||
|
public void Update(string tableName, List<(string, string)> setValues, List<DataBaseFitter> fitterList)
|
|||
|
{
|
|||
|
if (setValues.Count <= 0)
|
|||
|
{
|
|||
|
Debug.LogError("Sqlite修改表数据为空,请检查数据!");
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
string setStr = "";
|
|||
|
|
|||
|
for (int i = 0; i < setValues.Count; i++)
|
|||
|
{
|
|||
|
if (i == 0)
|
|||
|
{
|
|||
|
setStr += $"{setValues[i].Item1} = '{setValues[i].Item2}'";
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
setStr += $",{setValues[i].Item1} = '{setValues[i].Item2}'";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
string condition = "";
|
|||
|
|
|||
|
for (int i = 0; i < fitterList.Count; i++)
|
|||
|
{
|
|||
|
if (i == 0)
|
|||
|
{
|
|||
|
condition += $"{fitterList[i].columnName} {DataBaseFitter.FormatFitter(fitterList[i].fitterType)} {fitterList[i].fitterValue}";
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
condition += $" AND {fitterList[i].columnName} {DataBaseFitter.FormatFitter(fitterList[i].fitterType)} {fitterList[i].fitterValue}";
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
string commandStr = $"UPDATE {tableName} SET {setStr} WHERE {condition};";
|
|||
|
Debug.Log("Sqlite修改表记录Sql:" + commandStr);
|
|||
|
command.CommandText = commandStr;
|
|||
|
command.ExecuteNonQuery();
|
|||
|
}
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
#region 查
|
|||
|
|
|||
|
public SqliteDataReader Select(string tableName, List<DataBaseFitter> fitterList = null, int limitNum = 0)
|
|||
|
{
|
|||
|
string condition = "";
|
|||
|
|
|||
|
if (fitterList != null)
|
|||
|
{
|
|||
|
for (int i = 0; i < fitterList.Count; i++)
|
|||
|
{
|
|||
|
if (i == 0)
|
|||
|
{
|
|||
|
condition += $"WHERE {fitterList[i].columnName} {DataBaseFitter.FormatFitter(fitterList[i].fitterType)} {fitterList[i].fitterValue}";
|
|||
|
}
|
|||
|
else
|
|||
|
{
|
|||
|
condition += $" AND {fitterList[i].columnName} {DataBaseFitter.FormatFitter(fitterList[i].fitterType)} {fitterList[i].fitterValue}";
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
string limit = limitNum > 0 ? $"LIMIT {limitNum}" : "";
|
|||
|
|
|||
|
string commandStr = $"SELECT * FROM {tableName} {condition} {limit};";
|
|||
|
Debug.Log("Sqlite查询表记录Sql:" + commandStr);
|
|||
|
command.CommandText = commandStr;
|
|||
|
SqliteDataReader read = command.ExecuteReader();
|
|||
|
return read;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
#endregion
|
|||
|
|
|||
|
}
|
|||
|
}
|