190 lines
4.9 KiB
C#
190 lines
4.9 KiB
C#
|
|
|
||
|
|
|
||
|
|
namespace Guru
|
||
|
|
{
|
||
|
|
using SQLite4Unity3d;
|
||
|
|
using UnityEngine;
|
||
|
|
using System.Collections;
|
||
|
|
using System;
|
||
|
|
using System.IO;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.Linq;
|
||
|
|
using System.Linq.Expressions;
|
||
|
|
using UnityEngine.Networking;
|
||
|
|
|
||
|
|
public class DBService
|
||
|
|
{
|
||
|
|
internal const string DefaultDBName = "data";
|
||
|
|
internal const string DefaultDBExtension = ".db";
|
||
|
|
internal static string DebugDBPath = "mocks_dir/db";
|
||
|
|
private SQLiteConnection _connection;
|
||
|
|
private string _dbName;
|
||
|
|
private string _dbPath;
|
||
|
|
private bool _isDebug = false;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 获取数据库的路径
|
||
|
|
/// </summary>
|
||
|
|
public string DatabasePath => _dbPath;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 启动服务
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="name"></param>
|
||
|
|
/// <param name="isDebug"></param>
|
||
|
|
public DBService(string name, bool isDebug = false)
|
||
|
|
{
|
||
|
|
_isDebug = isDebug;
|
||
|
|
if (string.IsNullOrEmpty(name)) name = DefaultDBName;
|
||
|
|
_dbName = name;
|
||
|
|
_dbPath = Path.GetFullPath($"{Application.persistentDataPath}/{_dbName}{DefaultDBExtension}");
|
||
|
|
|
||
|
|
if (isDebug)
|
||
|
|
{
|
||
|
|
_dbPath = Path.GetFullPath($"{Application.persistentDataPath}/{_dbName}_debug{DefaultDBExtension}");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public static DBService Open(string name, bool isDebug = false)
|
||
|
|
{
|
||
|
|
var ds = new DBService(name, isDebug);
|
||
|
|
ds.Connect();
|
||
|
|
return ds;
|
||
|
|
}
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 关闭连接
|
||
|
|
/// </summary>
|
||
|
|
public void Close() => _connection?.Close();
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 建立连接, 若不存在则创建数据库
|
||
|
|
/// </summary>
|
||
|
|
public void Connect(string dbPath = "")
|
||
|
|
{
|
||
|
|
if(!string.IsNullOrEmpty(dbPath)) _dbPath = dbPath;
|
||
|
|
_connection = new SQLiteConnection(_dbPath, SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create);
|
||
|
|
}
|
||
|
|
|
||
|
|
public bool Exists => File.Exists(_dbPath);
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 部署默认的 Database
|
||
|
|
/// 将内置在 StreamingAssets 中的数据库文件部署到 PersistentDataPath 中
|
||
|
|
/// </summary>
|
||
|
|
/// <returns></returns>
|
||
|
|
public void DeployEmbeddedDB(string embeddedPath, Action<bool> onComplete)
|
||
|
|
{
|
||
|
|
string from = Path.Combine(Application.streamingAssetsPath, embeddedPath);
|
||
|
|
|
||
|
|
var uwr = new UnityWebRequest(from);
|
||
|
|
uwr.SendWebRequest().completed += ao =>
|
||
|
|
{
|
||
|
|
var success = false;
|
||
|
|
try
|
||
|
|
{
|
||
|
|
if ( uwr.result == UnityWebRequest.Result.Success)
|
||
|
|
{
|
||
|
|
File.WriteAllBytes(_dbPath, uwr.downloadHandler.data);
|
||
|
|
success = true;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
catch (Exception e)
|
||
|
|
{
|
||
|
|
Debug.LogError(e);
|
||
|
|
}
|
||
|
|
onComplete?.Invoke(success);
|
||
|
|
};
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 获取表格
|
||
|
|
/// </summary>
|
||
|
|
/// <typeparam name="T"></typeparam>
|
||
|
|
/// <returns></returns>
|
||
|
|
public IEnumerable<T> CreatOrLoadTable<T>() where T: new()
|
||
|
|
{
|
||
|
|
_connection.CreateTable<T>();
|
||
|
|
return _connection.Table<T>();
|
||
|
|
}
|
||
|
|
|
||
|
|
public List<T> GetTableList<T>() where T: new()
|
||
|
|
{
|
||
|
|
var tb = CreatOrLoadTable<T>();
|
||
|
|
return tb?.ToList() ?? new List<T>();
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
public int Insert<T>(T value)
|
||
|
|
{
|
||
|
|
return _connection.Insert(value);
|
||
|
|
}
|
||
|
|
|
||
|
|
public int InsertAll(IEnumerable data)
|
||
|
|
{
|
||
|
|
return _connection.InsertAll(data);
|
||
|
|
}
|
||
|
|
|
||
|
|
public int Remove(object primaryKey)
|
||
|
|
{
|
||
|
|
return _connection.Delete(primaryKey);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public int Remove<T>(object primaryKey)
|
||
|
|
{
|
||
|
|
return _connection.Delete<T>(primaryKey);
|
||
|
|
}
|
||
|
|
|
||
|
|
public int UpdateAll(IEnumerable data)
|
||
|
|
{
|
||
|
|
return _connection.UpdateAll(data);
|
||
|
|
}
|
||
|
|
|
||
|
|
public T Get<T>(object primaryKey) where T : new()
|
||
|
|
{
|
||
|
|
return _connection.Get<T>(primaryKey);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
public T Find<T>(Expression<Func<T, bool>> predicate) where T : new()
|
||
|
|
{
|
||
|
|
return _connection.Find<T>(predicate);
|
||
|
|
}
|
||
|
|
|
||
|
|
private bool _onCmdExecution = false;
|
||
|
|
/// <summary>
|
||
|
|
/// 执行 SQL 语句
|
||
|
|
/// </summary>
|
||
|
|
/// <param name="query"></param>
|
||
|
|
/// <param name="onExecutionComplete"></param>
|
||
|
|
/// <param name="args"></param>
|
||
|
|
/// <returns></returns>
|
||
|
|
public int Execute(string query, Action<double> onExecutionComplete = null, params object[] args)
|
||
|
|
{
|
||
|
|
if (_onCmdExecution) return -1;
|
||
|
|
|
||
|
|
SQLiteConnection.TimeExecutionHandler del = null;
|
||
|
|
del = (t1, t2) =>
|
||
|
|
{
|
||
|
|
_onCmdExecution = false;
|
||
|
|
_connection.TimeExecutionEvent -= del;
|
||
|
|
onExecutionComplete?.Invoke(t2.TotalSeconds);
|
||
|
|
};
|
||
|
|
_connection.TimeExecutionEvent += del;
|
||
|
|
_onCmdExecution = true;
|
||
|
|
return _connection.Execute(query, args);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
|
||
|
|
}
|