1. 程式人生 > >Unity3D《一看就明白系列》之Unity3D中使用SqlLite資料庫(二)採用框架結構

Unity3D《一看就明白系列》之Unity3D中使用SqlLite資料庫(二)採用框架結構

主要就是增刪改查,而這些操作語句我們主要就是更改其中的引數。

因此我們需要做一個架構來實現這一目標

DB:整體

中間功能層:實現功能

邏輯層:在功能層之下實現不同的邏輯

For Example:

Void Add(a,b)這是一個功能實現兩個數相加

Add(2,5)這是一個邏輯,指明誰和誰相加

 

因此增刪改查是功能,具體實現的資料操作是邏輯。

 

目標:“寫一個功能層”

 

主要流程:

  1. 開啟資料庫:程式啟動的時候開啟一次

  2. 增刪改查:  中間可以進行無數次的增刪改查

  3. 關閉資料庫:程式退出的時候 關閉一次

若實現以上的邏輯,採用單例模式較好,在這裡我更進一步進行了封裝,可以讓不懂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