Unity3D《一看就明白系列》之Unity3D中使用SqlLite数据库(二)采用框架结构

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_37067895/article/details/85461654

主要就是增删改查,而这些操作语句我们主要就是更改其中的参数。

因此我们需要做一个架构来实现这一目标

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

猜你喜欢

转载自blog.csdn.net/qq_37067895/article/details/85461654
今日推荐