Unity下使用Sqlite

news/2025/2/15 23:07:16/

sqlite和access类似是文件形式的数据库,不需要安装任何服务,可以存储数据,使用起来还是挺方便的。

首先需要安装DLL

需要的DLL

我们找到下面两个文件放入Plugins目录
Mono.Data.Sqlite.dll
System.Data.dll
DLL文件位于Unity的安装目录下的
2022.3.14f1c1\Editor\Data\MonoBleedingEdge\lib\mono\unityjit-win32

另外还需要sqlite3.dll
在官网下载sqlite3.dll也放入Plugins

使用Sqlite

网上有网友写的SQLiteHelper,方便数据库操作,这里直接Copy了。

using UnityEngine;
using Mono.Data.Sqlite;
using System;public class SQLiteHelper
{/// <summary>/// 数据库连接定义/// </summary>private SqliteConnection dbConnection;/// <summary>/// SQL命令定义/// </summary>private SqliteCommand dbCommand;/// <summary>/// 数据读取定义/// </summary>private SqliteDataReader dataReader;/// <summary>/// 构造函数   /// </summary>/// <param name="connectionString">数据库连接字符串</param>public SQLiteHelper(string connectionString){try{//构造数据库连接dbConnection = new SqliteConnection(connectionString);//打开数据库dbConnection.Open();}catch (Exception e){Debug.Log(e.ToString());}}/// <summary>/// 执行SQL命令/// </summary>/// <returns>The query.</returns>/// <param name="queryString">SQL命令字符串</param>public SqliteDataReader ExecuteQuery(string queryString){dbCommand = dbConnection.CreateCommand();dbCommand.CommandText = queryString;dataReader = dbCommand.ExecuteReader();return dataReader;}/// <summary>/// 关闭数据库连接/// </summary>public void CloseConnection(){//销毁Commandif (dbCommand != null){dbCommand.Cancel();}dbCommand = null;//销毁Readerif (dataReader != null){dataReader.Close();}dataReader = null;//销毁Connectionif (dbConnection != null){dbConnection.Close();}dbConnection = null;}/// <summary>/// 读取整张数据表/// </summary>/// <returns>The full table.</returns>/// <param name="tableName">数据表名称</param>public SqliteDataReader ReadFullTable(string tableName){string queryString = "SELECT * FROM " + tableName;return ExecuteQuery(queryString);}/// <summary>/// 向指定数据表中插入数据/// </summary>/// <returns>The values.</returns>/// <param name="tableName">数据表名称</param>/// <param name="values">插入的数值</param>public SqliteDataReader InsertValues(string tableName, string[] values){//获取数据表中字段数目int fieldCount = ReadFullTable(tableName).FieldCount;//当插入的数据长度不等于字段数目时引发异常if (values.Length != fieldCount){throw new SqliteException("values.Length!=fieldCount");}string queryString = "INSERT INTO " + tableName + " VALUES (" + values[0];for (int i = 1; i < values.Length; i++){queryString += ", " + values[i];}queryString += " )";return ExecuteQuery(queryString);}/// <summary>/// 更新指定数据表内的数据/// </summary>/// <returns>The values.</returns>/// <param name="tableName">数据表名称</param>/// <param name="colNames">字段名</param>/// <param name="colValues">字段名相应的数据</param>/// <param name="key">关键字</param>/// <param name="value">关键字相应的值</param>public SqliteDataReader UpdateValues(string tableName, string[] colNames, string[] colValues, string key, string operation, string value){//当字段名称和字段数值不正确应时引发异常if (colNames.Length != colValues.Length){throw new SqliteException("colNames.Length!=colValues.Length");}string queryString = "UPDATE " + tableName + " SET " + colNames[0] + "=" + colValues[0];for (int i = 1; i < colValues.Length; i++){queryString += ", " + colNames[i] + "=" + colValues[i];}queryString += " WHERE " + key + operation + value;return ExecuteQuery(queryString);}/// <summary>/// 删除指定数据表内的数据/// </summary>/// <returns>The values.</returns>/// <param name="tableName">数据表名称</param>/// <param name="colNames">字段名</param>/// <param name="colValues">字段名相应的数据</param>public SqliteDataReader DeleteValuesOR(string tableName, string[] colNames, string[] operations, string[] colValues){//当字段名称和字段数值不正确应时引发异常if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length){throw new SqliteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");}string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + colValues[0];for (int i = 1; i < colValues.Length; i++){queryString += "OR " + colNames[i] + operations[0] + colValues[i];}return ExecuteQuery(queryString);}/// <summary>/// 删除指定数据表内的数据/// </summary>/// <returns>The values.</returns>/// <param name="tableName">数据表名称</param>/// <param name="colNames">字段名</param>/// <param name="colValues">字段名相应的数据</param>public SqliteDataReader DeleteValuesAND(string tableName, string[] colNames, string[] operations, string[] colValues){//当字段名称和字段数值不正确应时引发异常if (colNames.Length != colValues.Length || operations.Length != colNames.Length || operations.Length != colValues.Length){throw new SqliteException("colNames.Length!=colValues.Length || operations.Length!=colNames.Length || operations.Length!=colValues.Length");}string queryString = "DELETE FROM " + tableName + " WHERE " + colNames[0] + operations[0] + colValues[0];for (int i = 1; i < colValues.Length; i++){queryString += " AND " + colNames[i] + operations[i] + colValues[i];}return ExecuteQuery(queryString);}/// <summary>/// 创建数据表/// </summary> +/// <returns>The table.</returns>/// <param name="tableName">数据表名</param>/// <param name="colNames">字段名</param>/// <param name="colTypes">字段名类型</param>public SqliteDataReader CreateTable(string tableName, string[] colNames, string[] colTypes){string queryString = "CREATE TABLE " + tableName + "( " + colNames[0] + " " + colTypes[0];for (int i = 1; i < colNames.Length; i++){queryString += ", " + colNames[i] + " " + colTypes[i];}queryString += "  ) ";return ExecuteQuery(queryString);}/// <summary>/// Reads the table./// </summary>/// <returns>The table.</returns>/// <param name="tableName">Table name.</param>/// <param name="items">Items.</param>/// <param name="colNames">Col names.</param>/// <param name="operations">Operations.</param>/// <param name="colValues">Col values.</param>public SqliteDataReader ReadTable(string tableName, string[] items, string[] colNames, string[] operations, string[] colValues){string queryString = "SELECT " + items[0];for (int i = 1; i < items.Length; i++){queryString += ", " + items[i];}queryString += " FROM " + tableName + " WHERE " + colNames[0] + " " + operations[0] + " " + colValues[0];for (int i = 0; i < colNames.Length; i++){queryString += " AND " + colNames[i] + " " + operations[i] + " " + colValues[0] + " ";}return ExecuteQuery(queryString);}
}

调用:

//创建名为sqlite4unity的数据库
sql = new SQLiteHelper("data source=" + Application.dataPath + "/game.db");//创建名为table1的数据表
sql.CreateTable("table1", new string[] { "ID", "Name", "Age", "Email" }, new string[] { "INTEGER", "TEXT", "INTEGER", "TEXT" });//插入两条数据
sql.InsertValues("table1", new string[] { "'1'", "'张三'", "'22'", "'Zhang3@163.com'" });
sql.InsertValues("table1", new string[] { "'2'", "'李四'", "'25'", "'Li4@163.com'" });//更新数据。将Name="张三"的记录中的Name改为"Zhang3"
sql.UpdateValues("table1", new string[] { "Name" }, new string[] { "'Zhang3'" }, "Name", "=", "'张三'");//插入3条数据
sql.InsertValues("table1", new string[] { "3", "'王五'", "25", "'Wang5@163.com'" });
sql.InsertValues("table1", new string[] { "4", "'王五'", "26", "'Wang5@163.com'" });
sql.InsertValues("table1", new string[] { "5", "'王五'", "27", "'Wang5@163.com'" });//删除Name="王五"且Age=26的记录,DeleteValuesOR方法相似
sql.DeleteValuesAND("table1", new string[] { "Name", "Age" }, new string[] { "=", "=" }, new string[] { "'王五'", "'26'" });//读取整张表
SqliteDataReader reader = sql.ReadFullTable("table1");
while (reader.Read())
{//读取IDDebug.Log(reader.GetInt32(reader.GetOrdinal("ID")));//读取NameDebug.Log(reader.GetString(reader.GetOrdinal("Name")));//读取AgeDebug.Log(reader.GetInt32(reader.GetOrdinal("Age")));//读取EmailDebug.Log(reader.GetString(reader.GetOrdinal("Email")));
}//读取数据表中Age>=25的全部记录的ID和Name
reader = sql.ReadTable("table1", new string[] { "ID", "Name" }, new string[] { "Age" }, new string[] { ">=" }, new string[] { "'25'" });
while (reader.Read())
{//读取IDDebug.Log(reader.GetInt32(reader.GetOrdinal("ID")));//读取NameDebug.Log(reader.GetString(reader.GetOrdinal("Name")));
}//自己定义SQL,删除数据表中全部Name="王五"的记录
sql.ExecuteQuery("DELETE FROM table1 WHERE NAME='王五'");//关闭数据库连接
sql.CloseConnection();

管理数据的UI软件

打开数据的免费软件可以用DB Browser for SQLite,一个免费的。
在这里插入图片描述

引用和参考

本文参考文献连接:

Unity3D游戏开发之SQLite让数据库开发更简单

找Dll,参考这里


http://www.ppmy.cn/news/1350702.html

相关文章

Linux第48步_编译正点原子的出厂Linux内核源码

编译正点原子的出厂 Linux 内核源码&#xff0c;为后面移植linux做准备。研究对象如下&#xff1a; 1)、linux内核镜像文件“uImage” 路径为“arch/arm/boot”&#xff1b; 2)、设备树文件“stm32mp157d-atk.dtb” 路径为“arch/arm/boot/dts” 3)、默认配置文件“stm32m…

django的基本使用-ORM(二)

一、简介 ORM对象关系映射&#xff0c;它允许你使用类和对象对数据库进行操作&#xff0c;从而避免通过SQL语句操作数据库 模型层: 负责和数据库之间进行通信 模型是一个Python类&#xff0c;它是由django.db.models.Model派生出的子类 一个模型类代表数据库中的一张表 模型类…

蓝桥杯刷题day08——完全日期

1、题目描述 如果一个日期中年月日的各位数字之和是完全平方数&#xff0c;则称为一个完全日期。 例如&#xff1a;2021年6月5日的各位数字之和为20216516&#xff0c;而16是一个完全平方数&#xff0c;它是4的平方。所以2021年6月5日是一个完全日期。 请问&#xff0c;从200…

STM32Cubmax DAC 采集

一、概念 DMA&#xff0c;全称为&#xff1a; Direct Memory Access&#xff0c;即直接存储器访问&#xff0c; DMA 传输将数据从一个 地址空间复制到另外一个地址空间。 当 CPU 初始化这个传输动作&#xff0c;传输动作本身是由 DMA 控制器 来实行和完成。典型的例子就是移动…

备战蓝桥杯---组合数学2

本专题主要介绍容斥原理。 大家高中的时候肯定接触过韦恩图&#xff0c;容斥原理比较通俗的理解就是减去所有可能并加上重叠的部分。 我们直接看公式&#xff1a; 知道后&#xff0c;我们先看道模板题&#xff1a; 下面是AC代码&#xff1a; #include<bits/stdc.h> us…

矩阵在计算机图像处理中的应用

矩阵在计算机图像处理中是非常核心的概念&#xff0c;因为它们为表示和操作图像数据提供了一种非常方便和强大的方式。以下是矩阵在计算机图像处理中的一些关键作用&#xff1a; 图像表示&#xff1a;在计算机中&#xff0c;图像通常被表示为像素矩阵&#xff0c;也就是二维数组…

VTK 三维场景的基本要素(相机) vtkCamera

观众的眼睛好比三维渲染场景中的相机&#xff0c;在VTK中用vtkCamera类来表示。vtkCamera负责把三维场景投影到二维平面&#xff0c;如屏幕&#xff0c;相机投影示意图如下图所示。 1.与相机投影相关的要素主要有如下几个&#xff1a; 1&#xff09;相机位置: 相机所处的位置…

强大的头像制作神器微信小程序源码/支持外卖CPS等优惠劵小程序源码

强大的头像制作神器微信小程序源码&#xff0c;支持外卖CPS等优惠劵小程序源码&#xff1b;这是一款目前见到比较丰富的头像制作小程序&#xff0c;拥有丰富的模板&#xff0c;多种分类基本大全。 支持直接获取微信头像&#xff0c;或者直接上传图片&#xff1b;另外上传的话还…