Unity3D《一看就明白系列》之Unity3D中使用SqlLite資料庫(二)採用框架結構
阿新 • • 發佈:2018-12-31
主要就是增刪改查,而這些操作語句我們主要就是更改其中的引數。
因此我們需要做一個架構來實現這一目標
DB:整體
中間功能層:實現功能
邏輯層:在功能層之下實現不同的邏輯
For Example:
Void Add(a,b)這是一個功能實現兩個數相加
Add(2,5)這是一個邏輯,指明誰和誰相加
因此增刪改查是功能,具體實現的資料操作是邏輯。
目標:“寫一個功能層”
主要流程:
-
開啟資料庫:程式啟動的時候開啟一次
-
增刪改查: 中間可以進行無數次的增刪改查
-
關閉資料庫:程式退出的時候 關閉一次
若實現以上的邏輯,採用單例模式較好,在這裡我更進一步進行了封裝,可以讓不懂sql語句的人也可以方便的呼叫
話不多少,上程式碼:
第一個類是功能層:
using System.Collections; using System.Collections.Generic; using UnityEngine; using Mono.Data.Sqlite; public class SQLiteTools { private static SQLiteTools instance; /// <summary> /// 單例模式(不繼承Mono) /// </summary> public static SQLiteTools Instance { get { if (instance == null) { instance = new SQLiteTools(); } return instance; } } /// <summary> /// 沒有引數的構造方法,方便單例 /// </summary> public SQLiteTools() { } /// <summary> /// 開啟做成一個構造方法,方便呼叫者工作量 /// </summary> /// <param name="path"></param> public SQLiteTools(string path) { Open(path); } /// <summary> ///執行命令(相當於開啟視覺化介面的命令視窗) /// </summary> SqliteCommand sqlCommond; /// <summary> /// 資料庫控制代碼(連線記憶體和資料庫的一個記憶體區) /// </summary> SqliteConnection dbConnect; SqliteDataReader sqlReader; /// <summary> /// 開啟資料庫 /// </summary> /// <param name="path">資料庫路徑</param> public void Open(string path) { //開啟保護 if (dbConnect != null) return; dbConnect = new SqliteConnection(path); //開啟很可能有問題,比如路徑錯誤等 try { dbConnect.Open(); } catch (System.Exception e) { Debug.LogError("Open db error==" + e.Message); } } /// <summary> /// 執行的Sql語句是一個字串,將結果返回上層,本層只是功能層,不做邏輯處理 /// </summary> /// <param name="sql">sql語句</param> public SqliteDataReader ExcuseSql(string sql) { sqlCommond = dbConnect.CreateCommand(); //執行語句(相當於在視覺化命令介面輸入什麼樣的語句) sqlCommond.CommandText = sql; sqlReader = sqlCommond.ExecuteReader(); return sqlReader; } /// <summary> /// 建立資料表的封裝 /// </summary> /// <param name="tableName">要建立的資料表的名字</param> /// <param name="colsName">列的屬性</param> public void CreateTable(string tableName,string[]colsName) { string sql = "create table " + tableName + " ( "; for (int i = 0; i < colsName.Length-1; i++) { sql += colsName[i] + " , "; } sql += colsName[colsName.Length - 1] + " ); "; Debug.Log("create table:" + sql); ExcuseSql(sql); } /// <summary> /// 刪除表的封裝 /// </summary> /// <param name="tableName">要刪除的表的名字</param> public void DropTable(string tableName) { string sql = " drop table " + tableName + " ;"; ExcuseSql(sql); } /// <summary> /// 插入資料的封裝 /// </summary> /// <param name="tableName">要插入的表的名字</param> /// <param name="colsName">插入的列的名字</param> /// <param name="colsValue">插入的值</param> public void InsertInto(string tableName,string[]colsName,string[]colsValue) { string sql = "insert into " + tableName + "( "; for (int i = 0; i < colsName.Length-1; i++) { sql += colsName[i] + " , "; } sql += colsName[colsName.Length - 1] + " ) values ( "; for (int i = 0; i < colsValue.Length-1; i++) { sql += colsValue[i] + " , "; } sql += colsValue[colsValue.Length - 1] + " );"; ExcuseSql(sql); } /// <summary> /// 查詢資料的封裝 /// </summary> /// <param name="tableName">要查詢的資料表的名字</param> /// <param name="colsName">要查詢的列的名字</param> /// <returns>返回查詢到的資料資訊</returns> public SqliteDataReader Select(string tableName, string[] colsName) { string sql = " select "; for (int i = 0; i < colsName.Length-1; i++) { sql += colsName[i] + " , "; } sql += colsName[colsName.Length - 1] + " from " + tableName; return ExcuseSql(sql); } /// <summary> /// 修改資料的封裝 /// </summary> /// <param name="tableName">要修改的資料表</param> /// <param name="colsName">要修改的資料列</param> /// <param name="colsValue">修改後的資料值</param> /// <param name="condition">修改條件</param> public void Update(string tableName,string[]colsName,string[]colsValue,string condition) { string sql = " Update " + tableName + " set "; for (int i = 0; i < colsName.Length-1; i++) { sql += colsName[i] + " = " + colsValue[i]+" , "; } sql += colsName[colsName.Length-1] + " = " + colsValue[colsName.Length-1] +" where "+condition+";"; ExcuseSql(sql); } /// <summary> /// 刪除資料的封裝 /// </summary> /// <param name="tableName">要刪除的資料表</param> /// <param name="condition">刪除條件</param> public void DeleteRecord(string tableName,string condition) { string sql = " delete from " + tableName + " where " + condition + " ; "; ExcuseSql(sql); } /// <summary> /// 關閉資料庫 /// </summary> public void Close() { //輸入過資料庫開啟成功,則可以關閉它 if (dbConnect != null) { dbConnect.Close(); } //釋放執行命令 if (sqlCommond != null) { sqlCommond.Dispose(); } if (sqlReader != null) { sqlReader.Close(); } } }
第二個類是用來測試剛才的封裝
using System.Collections; using System.Collections.Generic; using UnityEngine; using Mono.Data.Sqlite; public class UseSQLite : MonoBehaviour { SQLiteTools sqLiteTools; void Start() { string path = "Data Source=" + Application.streamingAssetsPath + "/person.db"; SQLiteTools.Instance.Open(path); } /// <summary> /// 當程式結束後,關閉相關資料庫的連線 /// </summary> public void OnApplicationQuit() { SQLiteTools.Instance.Close(); } void Update() { //測試建立表 if (Input.GetKey(KeyCode.A)) { string[] cols = new string[] {"id integer primarykey not null","name text not null","sex text " }; SQLiteTools.Instance.CreateTable("Person5", cols); } //測試插入資料 if (Input.GetKey(KeyCode.B)) { string[] colsName = { "id", "name", "sex" }; string []colsValue = { "10", "'zhangzhang'", "'man'" }; SQLiteTools.Instance.InsertInto("Person3",colsName,colsValue); } //測試查詢資料 if (Input.GetKey(KeyCode.C)) { string[] colsName = { "id", "name" }; SqliteDataReader tmpReader= SQLiteTools.Instance.Select("person3", colsName); while (tmpReader.Read())//每讀一次就是一條資料 { //讀取資料中的每一個列 for (int i = 0; i < colsName.Length; i++) { Debug.Log("=" + tmpReader.GetValue(i)); } } } //測試修改資料 if (Input.GetKey(KeyCode.D)) { string[] colsName = { "sex", "name" }; string[] colsValue = { "'woman'", "'lisi'" }; string condition = "id =10"; SQLiteTools.Instance.Update("person3", colsName, colsValue, condition); } //測試刪除資料 if (Input.GetKey(KeyCode.Space)) { string condition = "id=10"; SQLiteTools.Instance.DeleteRecord("person3", condition); } } }
這樣的封裝有好有壞,對於新手來說,便於閱讀和理解,但對記憶體不太友好,有興趣的朋友可以嘗試一下StringBuilder或者String.Format