首页 > 数据库 >SQLiteManger 第一部分

SQLiteManger 第一部分

时间:2023-05-11 10:33:24浏览次数:44  
标签:return string 第一 queryString col SQLiteManger reader 部分 public

SQLiteManager相比于SQLiteHelper更像是一个帮手类,实现了一些常用的操作和查询,并且提供了不少快捷菜单方法(在编辑器中不用播放游戏即可执行测试)

SQLiteManager只提供了测试连接、创建数据库和显示所有表名的快捷方法,TableTool脚本提供的多一些

// Mono.Data.Sqlite请自行百度解决

// SQLiteHelper合集里有

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Reflection;
using UnityEngine;
using Mono.Data.Sqlite;
using MyHelper;

namespace SaveAndLoader
{
    public class SQLiteManager : MonoBehaviour
    {
        [Header(@"省略直到“StreamingAssets\”为止的路径字符")]
        public string DBPath;
        [Header(@"不要省略数据库的副文件名(如果有的话)")]
        public string DBName;

        SqliteConnection connection;
        SqliteCommand command;
        string connectionString;
        public SqliteDataReader reader;
        // ==================== ==================== ==================== ====================
        private void Start()
        {
            RefreshConnectionString();
        }
        void RefreshConnectionString()
        {
            connectionString = Application.streamingAssetsPath.Replace('/', '\\') + "\\";

            if (string.IsNullOrEmpty(DBPath))
                connectionString += DBName;
            else
                connectionString += DBPath.Replace('/', '\\') + "\\" + DBName;
        }
        // ==================== ==================== ==================== ====================
        // Connect将先尝试断开再连接,如果需要保持连接时不要欣然使用
        public bool Connect()
        {
            if (connection != null)
                DisconnectAndClear();

            RefreshConnectionString();
            return SQLiteHelper.Connect(out connection, out command, connectionString);
        }
        public void DisconnectAndClear()
        {
            if (reader != null && !reader.IsClosed)
                reader.Close();
            SQLiteHelper.DisconnectAndClear(ref connection, ref command);
        }
        public void ExecuteQuery(string queryString)
        {
            if (reader != null && !reader.IsClosed)
                reader.Close();
            reader = SQLiteHelper.ExecuteQuery(command, queryString);
        }
        public void VACUUM()
        {
            Connect();
            ExecuteQuery("VACUUM");
            DisconnectAndClear();
        }
        // ==================== ==================== ==================== ====================
        public void GetAllTablesName()
        {
            FileInfo DBFileInfo = new FileInfo(connectionString);
            if (File.Exists(connectionString) && DBFileInfo.Length == 0)
            {
                if (reader != null && !reader.IsClosed)
                { reader.Close(); reader = null; return; }
            }

            string queryString = "SELECT name FROM sqlite_master where type='table' order by name";
            ExecuteQuery(queryString);
        }
        public List<string> GetAllTablesNameToList()
        {
            GetAllTablesName();
            if (reader == null)
                return new List<string>();

            List<string> returnList = new List<string>();
            while (reader.Read())
            {
                returnList.Add(reader["name"].ToString());
            }
            reader.Close();
            return returnList;
        }
        public bool IsTableExist(string tableName)
        {
            return GetAllTablesNameToList().Contains(tableName);
        }
        public void CreateTable(string tableName, List<TableColInfo> list_ColInfos)
        {
            if (!CheckList_TableColInfos(list_ColInfos))
            { Debug.LogError("ColInfo列表未通过检查!"); return; }
            if (IsTableExist(tableName))
            { Debug.LogError("表名已经被占用!"); return; }
            // ---------------- ---------------- ----------------
            string queryString = "CREATE TABLE IF NOT EXISTS " + tableName + " ( ";
            int n = 0;
            foreach (var col in list_ColInfos)
            {
                queryString += col.name + " " + col.type.ToString();

                // 添加主键信息
                if (col.isPK)
                    queryString += " PRIMARY KEY";
                // 添加NOTNULL信息
                if (col.isNOTNULL)
                    queryString += " NOT NULL";
                // 添加默认值信息
                if (!string.IsNullOrEmpty(col.dflt_value))
                    queryString += " DEFAULT " + col.dflt_value;

                if (n < list_ColInfos.Count - 1)
                    queryString += ",";

                n++;
            }
            queryString += ")";
            ExecuteQuery(queryString);
            reader.Close();
        }
        public void RenameTable(string tableName, string newTableName)
        {
            string queryString = "ALTER TABLE " + tableName + " RENAME TO " + newTableName;
            ExecuteQuery(queryString);
            reader.Close();
        }
        public void DeleteTable(string tableName)
        {
            string queryString = "DROP TABLE " + tableName;
            ExecuteQuery(queryString);
            reader.Close();
        }
        // ==================== ==================== ==================== ====================
        public bool CheckList_TableColInfos(List<TableColInfo> cols)
        {
            if (cols == null || cols.Count == 0) return false;
            //---------------- ---------------- ----------------
            List<string> existingColNames = new List<string>();
            int PKCount = 0;
            foreach (var col in cols)
            {
                // 检查:所有的列名都不可为null或""
                if (string.IsNullOrEmpty(col.name))
                    return false;

                // 检查:name不可重复
                if (existingColNames.Contains(col.name))
                    return false;
                else
                    existingColNames.Add(col.name);

                // 检查:数据类型不包含NULL型
                if (col.type == SQLiteDataType.NULL) return false;

                // 检查:主键只能有1个
                if (col.isPK)
                {
                    PKCount++;
                    if (PKCount > 1) return false;
                }
            }
            return true;
        }
        // ==================== ==================== ==================== ====================
        [ContextMenu("TestConnect")]
        public void TestConnect()
        {
            RefreshConnectionString();
            if (Connect())
                Debug.Log($"连接成功!(已断开)——{connectionString}");
            else
                Debug.LogError($"连接失败!——{connectionString}");

            DisconnectAndClear();
        }

        [ContextMenu("CreateNewDB")]
        public void CreateNewDB()
        {
            string path = Application.streamingAssetsPath.Replace('/', '\\');
            if (!string.IsNullOrEmpty(DBPath))
                path += "\\" + DBPath.Replace('/', '\\');

            Debug.Log($"正在尝试创建{path}" + "\\" + DBName);
            Debug.LogWarning($"Project窗口中的显示可能稍微滞后,可尝试刷新以加快显示。");
            SQLiteHelper.CreateDB(path, DBName);
        }

        [ContextMenu("PrintAllTabelsName")]
        public void PrintAllTablesName()
        {
            RefreshConnectionString();

            List<string> names;
            if (Connect())
                names = GetAllTablesNameToList();
            else
            {
                Debug.LogError("连接数据库失败。");
                DisconnectAndClear();
                return;
            }

            if (names.Count == 0)
                Debug.Log("数据库中没有表。");
            else
            {
                Debug.Log($"数据库中共有{names.Count}张表:");
                foreach (var n in names)
                    Debug.Log(n);
            }
            DisconnectAndClear();
        }
    }
}

 

标签:return,string,第一,queryString,col,SQLiteManger,reader,部分,public
From: https://www.cnblogs.com/xhbnfcl/p/17388845.html

相关文章

  • Centos环境下部分中间件“rabbitmq、rocketmq、clickhouse”部署
    部分中间件部署目录部分中间件部署docker部署rabbitmqdocker部署rocketmq单机部署clickhousedocker部署rabbitmq#拉镜像dockerpullrabbitmq:3.8-management#启动dockerrun\-eRABBITMQ_DEFAULT_USER=guest\-eRABBITMQ_DEFAULT_PASS=guest\-v/data/rabbitmq/ra......
  • N4-P4部分debug
    ERROR1:a=sum.read(1)+bERROR2:a=a+1ERROR3:Thetargetlimitsthenumberofactionsaccessingasingleregisterto4.ERROR4:ConditionsinanactionmustbesimplecomparisonsofanactiondataparameterTrymovingthetestoutoftheactionan......
  • 2023-05-10:给你一棵以 root 为根的二叉树和一个 head 为第一个节点的链表 如果在二叉
    2023-05-10:给你一棵以root为根的二叉树和一个head为第一个节点的链表如果在二叉树中,存在一条一直向下的路径且每个点的数值恰好一一对应以head为首的链表中每个节点的值,那么请你返回True否则返回False。一直向下的路径的意思是:从树中某个节点开始,一直连续向下的路径......
  • 第一阶段详细绩效评估
     工作质量工作量主动性帮助团队自身成长总分王集洲959085859090陈俊杰908582.582.582.586冯嘉乐87.58582.5808585注:以上除总分外均为平均分 ......
  • 资料分析第一道简单计算的小坑
    资料分析中第一道计算时必拿下的,但是往往计算时会加一些小坑,必须提高注意,哪怕多花10s也要稳住。如题:往往算到第二位时,会秒选A,但其实再往后算一位会发现答案更接近B往往感觉不好,容易选到C,建议多算一下或者多刷题培养感觉。......
  • 计组(risv-c)第一章
    第一章   第一章  1.1引言2.如前所述,软件和硬件都会影响程序的性能。请思考以下哪个例子属于性能瓶颈。·所选算法·编程语言或编译器·操作系统·处理器·I/O系统和设备答:  性能瓶颈指的是影响程序性能的最大限制因素,也就是整个系统中影响程序运......
  • 【备忘】go build 使用代理解决部分模块或依赖无法下载的问题
    1、查看go版本goversion2、如果版本为1.13及以上goenv-wGO111MODULE=ongoenv-wGOPROXY=https://goproxy.io,direct低于1.13版本$env:GO111MODULE="on"$env:GOPROXY="https://goproxy.io"......
  • rocky linux:安装epel,解决部分包搜索不到(Rocky Linux 9.1)
    一,安装epel我们以libzip-devel为例:默认搜索不到[root@img~]#yumsearchlibzip-develLastmetadataexpirationcheck:0:02:34agoonWed10May202301:15:06PMCST.Nomatchesfound.使crb为可用状态[root@img~]#dnfconfig-manager--set-enabledcrb安装epel......
  • 代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素。第一章 数组part01
    今天开始第一天,其实之前也刷过题,也写过博客,可是没有坚持下去;主要是没有动力吧,我又是一个严重的拖延症患者,还好遇到刷到Carl哥的视频,记得是在bilibili分享的二分法视频,感觉讲的挺好的,就加了微信;然后发现有刷题训练营,太适合我这种人了,果断加入,哈哈,废话不多说,开始刷题。  第......
  • PV_SPS_Model:基于MATLAB/Simulink的光伏组件串联部分遮阳仿真模型。
    PV_SPS_Model:基于MATLAB/Simulink的光伏组件串联部分遮阳仿真模型。仿真条件:MATLAB/SimulinkR2015bID:3635660069130461......