using System; using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; using XRTool.Util; namespace PublicTools.XMLDataBase { /// /// 一个辅助读写的脚本 /// 提供相关类型的读写操作 /// public class TableHelper { private TableInterface table; private string path; private List dataList; public event Action readConfComplete; public bool isInit = false; private Dictionary dataDic = new Dictionary(); private string priKey; /// /// 是否可写,默认可写 /// private bool isWrite = true; public TableHelper(string path, string priKey = null) { this.path = path; this.priKey = priKey; readConfComplete += OnRreadConfComplete; } /// /// 读取完成之后 /// private void OnRreadConfComplete() { if (DataList != null) { for (int i = 0; i < DataList.Count; i++) { if (string.IsNullOrEmpty(priKey)) { if (DataList[i] is TableBase) { var da = DataList[i] as TableBase; if (!dataDic.ContainsKey(da.priKey)) { dataDic.Add(da.priKey, DataList[i]); } } else if (DataList[i] is UnityEngine.Object) { var da = DataList[i] as UnityEngine.Object; if (!dataDic.ContainsKey(da.name)) { dataDic.Add(da.name, DataList[i]); } } } else { string key = ClazzFactory.GetPriKey(DataList[i], priKey); if (!dataDic.ContainsKey(key)) { dataDic.Add(key, DataList[i]); } } } } isInit = true; } public List DataList { get => dataList; set => dataList = value; } /// /// 打开指定的数据 /// /// public void Open(string priKey = null) { if (!string.IsNullOrEmpty(priKey)) { this.priKey = priKey; } isWrite = true; if (path.StartsWith(Application.streamingAssetsPath)) { #if !UNITY_EDITOR isWrite = false; #endif } if (isWrite) { table = XSql.Instance.OpenTable(path, typeof(T).Name, ".xml", true); if (!table.Open()) { table.Create(typeof(T).Name); } this.DataList = table.FindAllData(); readConfComplete?.Invoke(); } else { if (TimerMgr.ForceInstance()) { string fullPath = Path.Combine(path, typeof(T).Name + ".xml"); TimerMgr.Instance.StartCoroutine(XSql.Instance.ReadServerData(fullPath, (List scrollList) => { this.DataList = scrollList; readConfComplete?.Invoke(); })); } } } /// /// 添加一条配置 /// /// public void AddData(T conf, bool isSave = true) { if (table == null) { Open(priKey); } if (table != null) { if (string.IsNullOrEmpty(priKey)) { if (conf is TableBase) { var tab = conf as TableBase; if (table.InsertData(conf, tab.priKey)) { if (isSave) table.Save(); UnityLog.Log("Add Success!" + tab.priKey, 2); } else { UnityLog.LogError("Add DataConf Error!" + conf); } } else if (conf is UnityEngine.Object) { var tab = conf as UnityEngine.Object; if (table.InsertData(conf, tab.name)) { if (isSave) table.Save(); UnityLog.Log("Add Success!" + tab.name, 2); } else { UnityLog.LogError("Add DataConf Error!" + conf); } } else { if (table.InsertData(conf)) { if (isSave) table.Save(); UnityLog.Log("Add Success!" + conf, 2); } else { UnityLog.LogError("Add DataConf Error!" + conf); } } } else { string key = ClazzFactory.GetPriKey(conf, priKey); if (table.InsertData(conf, key)) { if (isSave) table.Save(); UnityLog.Log("Add Success!" + conf + key, 2); } else { UnityLog.LogError("Add DataConf Error!" + conf); } } } else { UnityLog.LogError("Add DataConf Error!No table" + conf); } } /// /// 删除这条配置 /// /// public void DelConf(string key, bool isSave = true) { if (table != null) { table.DeleteData(key); if (isSave) table.Save(); } Open(key); } /// /// 根据key值查找数据 /// 如果缓存列表里没有这条记录,则去循环列表中查找 /// /// /// public T FindData(string name, string priKey = null) { if (string.IsNullOrEmpty(priKey)) { priKey = this.priKey; } if (!string.IsNullOrEmpty(name)) { if (dataDic != null && dataDic.ContainsKey(name)) { return dataDic[name]; } else { ///存在主键值 if (!string.IsNullOrEmpty(priKey)) { return DataList.Find((data) => { if (name == ClazzFactory.GetPriKey(data, priKey)) { return true; } return false; }); } else { ///暴力破解法,很少使用,请尽量避免使用此分支 UnityLog.LogError("Use Wrong method!"); return DataList.Find((data) => { var dic = ClazzFactory.ClazzAnalyze(data); if (dic != null) { foreach (var item in dic) { if (item.Value == name) { return true; } } } return false; }); } } } return default; } } }