当前位置: 首页 > news >正文

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,参考这里

相关文章:

  • 开发自定义标记应用程序
  • 2024年远控软件年度盘点:安全、稳定、功能之选
  • 柚见(伙伴匹配系统)第三期
  • 动态水印怎么加 怎么去除动态水印 视频剪辑软件 会声会影安激活序列号 会声会影怎么剪辑视频
  • 2024beginCTF-Crypto 复现
  • linuxqq关闭主面板后无法再次打开的问题
  • 五.实战软件部署 4-5MYSQL 5.7版本在ubuntu(WSL环境)安装MYSQL 8.0版本在ubuntu(WSL环境)安装
  • LeetCode、901. 股票价格跨度【中等,单调栈】
  • ubuntu22.04@laptop OpenCV Get Started: 004_cropping_image
  • MySQL数据库⑨_事务(四个属性+回滚提交+隔离级别+MVCC)
  • 记一次页面接口502问题:“502 Bad Gateway”
  • 【docker 的常用命令——详细讲解】
  • 内网穿透工具
  • web3知识体系汇总
  • 用HTML5 + JavaScript绘制花、树
  • 收藏网友的 源程序下载网
  • [nginx文档翻译系列] 控制nginx
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android系统模拟器绘制实现概述
  • Babel配置的不完全指南
  • CAP 一致性协议及应用解析
  • Django 博客开发教程 8 - 博客文章详情页
  • ESLint简单操作
  • HTTP 简介
  • iOS帅气加载动画、通知视图、红包助手、引导页、导航栏、朋友圈、小游戏等效果源码...
  • Java 内存分配及垃圾回收机制初探
  • JavaScript异步流程控制的前世今生
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • Java知识点总结(JavaIO-打印流)
  • JS变量作用域
  • JS实现简单的MVC模式开发小游戏
  • js正则,这点儿就够用了
  • LintCode 31. partitionArray 数组划分
  • mysql 5.6 原生Online DDL解析
  • Python爬虫--- 1.3 BS4库的解析器
  • React的组件模式
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • SQLServer之创建显式事务
  • V4L2视频输入框架概述
  • 闭包,sync使用细节
  • 搞机器学习要哪些技能
  • 个人博客开发系列:评论功能之GitHub账号OAuth授权
  • 近期前端发展计划
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 前端_面试
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 数据可视化之 Sankey 桑基图的实现
  • 微信小程序实战练习(仿五洲到家微信版)
  • 白色的风信子
  • 2017年360最后一道编程题
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约