主要就是增删改查,而这些操作语句我们主要就是更改其中的参数。
因此我们需要做一个架构来实现这一目标
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