Unity下使用Sqlite

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.hqwc.cn/news/468158.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能ai写作系统,ai智能写作机器人

人工智能AI大数据深度&#xff1a;基于伪原创算法&#xff0c;采用神经网络算法&#xff0c;在超过1535000篇文章中进行自动学习、聚合算法进行人工智能的创建&#xff0c;内容语义不变&#xff0c;媒体阿里、腾讯、百度均于日前在百家号内容创作者盛典上推出人工智能创作支撑平…

【深度学习模型】扩散模型(Diffusion Model)基本原理及代码讲解

前言 生成式建模的扩散思想实际上已经在2015年&#xff08;Sohl-Dickstein等人&#xff09;提出&#xff0c;然而&#xff0c;直到2019年斯坦福大学&#xff08;Song等人&#xff09;、2020年Google Brain&#xff08;Ho等人&#xff09;才改进了这个方法&#xff0c;从此引发了…

Days 30 ElfBoard TF卡接口

ELF 1的TF卡槽P1是使用CPU的SDHC1接口&#xff0c;该接口支持SD、SDHC和SDXC&#xff08;UHS-I&#xff09;卡。当SDXC卡的等级是UHS-II或更高时&#xff0c;会被降级到UHS-I使用。原因是从UHS-II开始&#xff0c;增加了新的数据脚&#xff08;类比USB3.0与以往的区别&#xff…

leetcode(数组)128.最长连续序列(c++详细解释)DAY8

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个未排序的整数数组 nums &#xff0c;找出数字连续的最长序列&#xff08;不要求序列元素在原数组中连续&#xff09;的长度。 请你设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 示例 1&a…

问题:3【单选题】实现职业理想的一般步骤是()。 #媒体#媒体

问题&#xff1a;3【单选题】实现职业理想的一般步骤是()。 A、创业-立业-择业 B、择业-创业-立业 C、择业-立业-创业 D、立业-择业-创业 参考答案如图所示

【网站项目】026校园美食交流系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

《剑指 Offer》专项突破版 - 面试题 45 : 二叉树最低层最左边的值(C++ 实现)

题目链接&#xff1a;LCR 045. 找树左下角的值 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 如何在一棵二叉树中找出它最低层最左边节点的值&#xff1f;假设二叉树中最少有一个节点。例如&#xff0c;在下图所示的二叉树中最低层最左边一个节点的值是 5。 分析…

Atcoder ABC338 F - Negative Traveling Salesman

Negative Traveling Salesman&#xff08;消极的旅行推销员&#xff09; 时间限制&#xff1a;6s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】…

windows 启动和关闭mysql

1)打开我的电脑-->2)在左边文件中右键此电脑--> 3)点击管理-->4)点击服务和应用程序-->5)点击服务-->6)查找自己MySQL名称 右击 启动或者关闭

Pytorch学习03_TensorBoard使用02

Opencv读取图片&#xff0c;获得numpy型数据类型 复制图片的相对路径 目前这种type不适用&#xff0c;考虑用numpy类型 安装opencv&#xff0c;在pytorch环境下 pip install opencv-python 导入numpy import numpy as np 将PIL类型的img转换为 NumPy 数组 img_arraynp.array…

电子邮件、SMTP、POP3 、IMAP协议

目录 1 电子邮件 1.1 电子邮件系统的组成 1.1.1 用户代理 UA (User Agent) 1.1.2 邮件服务器 (Mail Server) 1.1.3 邮件发送和读取协议 1.2 发送和接收电子邮件的重要步骤 1.3 电子邮件的组成 1.4 电子邮件地址的格式 2 简单邮件传送协议 SMTP 2.1 SMTP 通信的三个阶…

Vue--》深入学习Tailwind CSS掌握优雅而高效的前端样式开发

Tailwind CSS是一个非常强大且灵活的CSS框架&#xff0c;适用于开发者希望高度定制化界面样式的项目。今天博主就 Tailwind CSS 做一个简单介绍以及案例讲解&#xff0c;争取读者阅读文章后入门。 仅靠一篇文章博主也不可能将Tailwind CSS所有内容讲解的面面俱到&#xff0c;在…