【Unity数据存储】Unity中使用SqLite数据库进行数据持久化

在这里插入图片描述


👨‍💻个人主页:@元宇宙-秩沅

👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!

👨‍💻 本文由 秩沅 原创

👨‍💻 专栏交流🧧
🟥Unity100个实战基础✨🎁
🟦 Unity100个精华一记✨🎁
🟩 Unity50个demo案例教程✨🎁
🟨 Unity100个精华细节BUG✨🎁

在这里插入图片描述

在这里插入图片描述


文章目录

    • 前言
    • 🎶(==1==) window环境配置
    • 🎶(==2==) SqLite语法
      • (1) CREATE TABLE : 用来创建一个关系表
      • (2)DROP TABLE: 删除一个表
      • (3)ALTER TABLE : 修改表结构
      • (4)INSERT INTO : 往表中插入数据
      • (5) 修改表内的数据
      • (6)DELETE FROM 删除表中所有的数据
      • (7)SELECT 数据查询
      • (8)高级查询
    • 🎶(==3==) SqLite在Unity中的使用
    • 🎶(==4==) SqLiteConroller管理器类封装
    • 🅰️系统路线学习点击跳转


前言

SQLite数据库是一种轻量级的嵌入式数据库系统,它用于存储和管理数据。在Unity游戏开发中,SQLite数据库可以用来存储游戏中的各种数据,例如玩家的角色信息、游戏进度、成就、排行榜等。

SQLite数据库在Unity中的作用如下:

  1. 存储游戏数据:SQLite数据库可以用来存储游戏中的各种数据,例如道具信息、任务进度、玩家设置等。通过SQLite数据库,游戏可以方便地保存和读取这些数据。

  2. 数据持久化:SQLite数据库可以用来实现数据的持久化,即使游戏退出或重启,数据仍然可以保存在数据库中,下次打开游戏时可以重新加载。

  3. 离线模式:SQLite数据库可以用来支持游戏的离线模式,即在没有网络连接的情况下,游戏可以从SQLite数据库中读取数据,进行游戏。

  4. 数据查询和更新:SQLite数据库提供了强大的查询和更新功能,游戏可以通过SQL语句进行数据的查询和更新操作,例如按条件查询玩家成绩排行榜、更新玩家金币数量等。

  5. 数据同步:如果游戏需要与服务器进行数据同步,SQLite数据库可以用来缓存服务器数据,减少对服务器的频繁访问,提高游戏性能。

SQLite数据库在Unity游戏中扮演了存储和管理游戏数据的重要角色,它为游戏提供了数据持久化、离线模式、查询和更新操作等功能,方便开发者管理和使用游戏中的各种数据。
MySQL 和SQLserve一般针对服务器中的数据
SqLite则大多用做客户端中的数据

MySQL 和SQLserve一般针对服务器中的数据
SqLite则大多用做客户端中的数据


🎶(1 window环境配置


sqLite下载通道

在这里插入图片描述

  • 下载好之后将路径复制在,设置中系统环境变量——系统变量的Path里,新建然后路径复制进去,一直确定
    在这里插入图片描述
    在这里插入图片描述
    打开窗口,输入sqlite3即可查看版本是否安装成功

在这里插入图片描述

Windows命令窗口常见的指令如下:

  1. dir:列出当前目录下的文件和子目录。
  2. cd:改变当前目录。
  3. mkdir:创建新的目录。
  4. rmdir:删除指定的目录。
  5. copy:复制文件。
  6. del:删除文件。
  7. ren:重命名文件。
  8. type:显示文件的内容。
  9. move:移动文件或目录。
  10. attrib:更改文件或目录的属性。
  11. chkdsk:检查磁盘上的错误。
  12. ping:测试网络连接。
  13. ipconfig:显示或修改网络设置。
  14. netstat:显示网络连接和端口信息。
  15. tasklist:列出当前正在运行的进程。
  16. taskkill:终止指定的进程。
  17. shutdown:关闭或重启计算机。
  18. help:显示命令窗口的帮助信息。
    这只是一些常见的指令,Windows命令窗口还有很多其他指令可供使用。您可以在命令窗口中输入"help"命令获取所有可用指令的列表和详细说明。

在这里插入图片描述


🎶(2 SqLite语法


为什么轻量,因为它是以文件的形式存储所有的数据

  • 外键:可与其他表格中的键进行关联

  • 唯一键:不可以重复,可以为空,一个表可以有多个

  • 主键:不可以重复,不可以为空,一个表里只有一个,自增

  • 打开或新建一个Sqlite文件
    splite3 文件名.splite

  • 看一下当前有哪些表
    .table

(1) CREATE TABLE : 用来创建一个关系表

语法:CREATE TABLE 表名(列名1	数据类型	“约束”(有可无)列名2	数据类型	“约束”(有可无)列名3	数据类型	“约束”(有可无)...);//注意,SQL语句要以分号结尾
数据类型:integer(size)	仅容纳整数,size规定数字的最大位数int(size)int decimal(size,d);容纳带小数的数字size 规定带数字的最大位数,d规定小数点右侧的最大位数real 实型char(size) 固定长度的字符串,size规定字符串的长度varchar(size) 可变长度的字符串,size规定字符串的最大字符数text	文本null 空date	日期2020/09/022020-09-02blob:二进制...
约束:not null 不为空unique 唯一primary  key	主键		(主键渐必须是唯一且不为空)primary  key	autoincrement 主键自增default 	默认eg: default "China"check	用于限制列中值的范围eg: check score >= 0 and score <= 100

(2)DROP TABLE: 删除一个表

语法:DROP TABLE 表名;

(3)ALTER TABLE : 修改表结构

重命名:ALTER TABLE 旧表名 rename to 新表名;
增加一列:ALTER TABLE 表名 add column 列名 数据类型

(4)INSERT INTO : 往表中插入数据

语法:INSERT INTO 表名 VALUES(1,值2,值3...);//给所有的列插入数据,有多少列就要填多少值。INSERT INTO 表名 VALUE(列名1,列名2....) VALUE (1,值2... );//给指定列插入数据

(5) 修改表内的数据

UPDATE 表名 set 列名 = 新值,...;
UPDATE 表名 set 列名 = 新值,...WHERE 条件;//条件用来定位要修改的某些行
条件:列名 运算符 值运算符: = 	!= 	>	 >=	 <=如果有多个条件,可以用andor连接
eg:update stu set age = 21;update stu set age = 30 where num = 1001;update stu set age = 30 where num > 60 and num < 999;

(6)DELETE FROM 删除表中所有的数据

DELETE FROM  表名;//删除表中所有的数据
DELETE FROM 表名 WHERE 条件;//删除满足条件数据eg:delete from stu;delete from stu where num = 1003;

(7)SELECT 数据查询

语法:SELECT	列名1...FROM 表名;SELECT *FROM 表名;//查询整个表的数据SELECT *FROM 表名 where 条件;//查询整个表的数据eg:insert into stu1(stu_num,stu_name,age,,addr) select stu_num,stu_name,age,addr from stu;//从stu表中插入数据,然后插入到stu1表中

(8)高级查询

模糊查询列名	like	通配符	(_%)_:	匹配单个字符&:匹配任意单个字符eg:select *from stu where name like 'wang_';select	*from stu where name like	'%wang%'
排序:按指定的列名进行排序order by 列名 asc/desc;//asc:升序	desc:降序eg:select *from stu order by age desc;//根据年龄降序排序限制记录条数limit 数字eg:select *from stu limit 2;//查看表中的前两条记录排序+限制eg:select *from stu order by age desc limit 1;//查看年龄最大的记录聚合函数cout(*)	//统计记录数量sum(列名)	//计算给定列的总和avg(列名)		//计算给定列的平均值min(列名)		//计算给定列的最小值max(列名)	//计算给定列*的最大值eg:select	cout(*)  from stu;select max(age)-min(age) from stu;别名eg:select num AS 学号,name AS	姓名 from stu;分组:group byeg:select age,cout(*) from stu group by age;//查询每个年龄的人数范围查询:between ... and ...eg:	select *from stu where age between 10 and 20;去重:distincteg:select distinct age from stu;子查询:in(值,...)in(select ...)eg:select *from stu where age in (18,20,25);select *from stu where age in (select age from stu where age < 30);		★★★★★★多表联接select	列名,...1,表2...where 条件select 列名,... form 表1	join2 on	联接条件  ... where	过滤条件;eg:学生表:	学号 	姓名 	年龄		班级		学校	...create table t_stu(num int primary key, name text,age int,class int school int);intsrt into t_stu values(1001,'wb1',18,100101,2001);insert into t_stu values(1002,'wb2',19,100101,2001);insert into t_stu values(1003.'wb3',20,100101,2002);学校表:编号		校名		电话		地址...create table t_school(num int primary key,name text, tel text,addr text);insert into t_school values(2001,'first',010-123456,'changsha');insert into t_school values(2002,'second',010-0101011,'shanghai');需求:查询学生的学号,姓名,学校名select  t_stu.num,t_stu.name,t_school,name from t_stu,t_school);===》学生表中的每一行都与学校表中的每一行进行联结,结果称之为 笛卡尔积此时,需要指明两个表联结条件,在上述表中,联结条件是 学校的编号相同两种联结写法:第一种: select t_stu,num, t_stu.name,t_school.name from t_stu,t_school where	t_stu.school = t_school.num;第二种:select t_stu.num,t_stu.name,t_school.name from t_stu join t_school on t_stu.school = t_school.num;select t_stu.num,t_stu.name,t_school.name from t_stu join t_school on t_stu.school = t_school.num where t_stu.num = 1002;

🎶(3 SqLite在Unity中的使用


  • 首先点开下列路径,找到选中的两个dll文件
    在这里插入图片描述

  • 把它拖到Plugins文件下面

在这里插入图片描述

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mono.Data.Sqlite;
using System;//-------------------------------
//-------功能: sqlist持久化模板
//-------创建者:         -------
//------------------------------public class SpliteContorller : MonoBehaviour
{void Start(){SqliteConnection sqliteConnnet = new SqliteConnection("Data Source" + Application.dataPath + "/Data/text/sqlist");sqliteConnnet.Open(); //打开数据库//---------------------------------------------//-------------增删改的语句模板------------------//---------------------------------------------//创建表的语句String sql = "sqlist语句";//创建sqlist命令SqliteCommand sqliteCommand = new SqliteCommand (sql , sqliteConnnet);//执行命令sqliteCommand.ExecuteNonQuery ();//执行后需要销毁sqliteCommand.Dispose ();//---------------------------------------//-------------查询语句模板---------------//---------------------------------------//-------------单个结果查询---------------sql = "查询语句";sqliteCommand = new SqliteCommand (sql ,sqliteConnnet);//装载获取的结果object obj = sqliteCommand.ExecuteScalar ();Debug.Log( Convert.ToInt32(obj) );sqliteCommand.Dispose();//-------------多个结果查询---------------sql = "查询语句";sqliteCommand = new SqliteCommand(sql, sqliteConnnet);//装载获取的结果SqliteDataReader reader = sqliteCommand.ExecuteReader ();//读取while ( reader.Read() ){//如int id = reader.GetInt32(0); //获取每一列的对象}sqliteCommand.Dispose();reader.Close();sqliteConnnet.Close();//关闭数据库}
}

🎶(4 SqLiteConroller管理器类封装


  • 简单封装
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Mono.Data.Sqlite;
using System;
using Unity.VisualScripting.Dependencies.Sqlite;//-------------------------------
//-------功能: sqlist管理器(单例)
//-------创建者:         -------
//------------------------------public class SpliteContorller : MonoBehaviour
{//-------单例模式的封装-------------private static SpliteContorller instance;public static SpliteContorller Instance => instance ;private SqliteConnection con;  //sqlist连接类private SqliteCommand Command; //sqlist命令类private void Awake(){instance = this ;}/// <summary>/// 打开数据库/// </summary>/// <param name="file"></param>public void Open( string file){con = new SqliteConnection("Data Source" + Application.dataPath + file);}/// <summary>/// 执行命令/// </summary>/// <param name="sqlStr">sqlist语句</param>public void ExecuteNonQuery( string sqlStr){//创建sqlist命令Command = new SqliteCommand(sql, con);//执行命令Command.ExecuteNonQuery();//执行后需要销毁Command.Dispose();}/// <summary>/// 执行单个查询/// </summary>/// <param name="sqlStr">sqlist语句</param>/// <returns></returns>public object ExecuteScalar( string sqlStr ){Command = new SqliteCommand(sqlStr, con);//装载获取的结果object obj = Command.ExecuteScalar();Command.Dispose();return obj;}/// <summary>/// 执行单个查询/// </summary>/// <param name="sqlStr">sqlist语句</param>/// <returns></returns>public SqliteDataReader ExecuteQuery(string sqlStr){Command = new SqliteCommand(sqlStr, con);//装载获取的结果SqliteDataReader reader = Command.ExecuteReader();Command.Dispose();return reader;  //记得在外面关闭    reader.Close();//还可继续封装}/// <summary>/// 关闭数据库/// </summary>public void OnDestroy(){con.Close();//关闭数据库}}

🅰️系统路线学习点击跳转


👨‍💻 Unity程序基础学习路线🧧
⭐【Unityc#专题篇】之c#进阶篇】🎁
⭐【Unityc#专题篇】之c#核心篇】🎁
⭐【Unityc#专题篇】之c#基础篇】🎁
⭐【Unity-c#专题篇】之c#入门篇】🎁
【Unityc#专题篇】—进阶章题单实践练习🎁
⭐【Unityc#专题篇】—基础章题单实践练习🎁
【Unityc#专题篇】—核心章题单实践练习🎁

你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1473196.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

win11 去除文件预览图并保留具体图片预览

运行下列脚本&#xff1a; off echo. taskkill /f /im explorer.exe timeout 2 /nobreak>nul echo. DEL /F /S /Q /A %LocalAppData%\Microsoft\Windows\Explorer\thumbcache_*.db REG ADD "HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\B…

C语言编译和编译预处理

编译预处理 • 编译是指把高级语言编写的源程序翻译成计算机可识别的二进制程序&#xff08;目标程序&#xff09;的过程&#xff0c;它由编译程序完成。 • 编译预处理是指在编译之前所作的处理工作&#xff0c;它由编译预处理程序完成 在对一个源程序进行编译时&#xff0c;…

Linux系统(CentOS)安装iptables防火墙

1&#xff0c;先检查是否安装了iptables 检查安装文件-执行命令&#xff1a;rpm -qa|grep iptables 检查安装文件-执行命令&#xff1a;service iptables status 2&#xff0c;如果安装了就卸装(iptables-1.4.21-35.el7.x86_64 是上面命令查出来的版本) 执行命令&#xff1a…

Nginx(http配置、https配置)访问Spring Boot 项目

前文 记录一下在linux服务器下配置nginx中nginx.conf文件代理访问springboot项目 1. spring boot.yml配置 其他mysql,redis,mybatis等之类的配置就不一一列出了 # 自定义配置 为了等下验证读取的配置文件环境 appName: productserver:port: 8083 # 应用服务 WEB 访问端口s…

分享:Motionity-开源的Web端动画编辑器

Motionity是一个免费且开源的Web端动画编辑器&#xff0c;它结合了After Effects和Canva的优点&#xff0c;为用户提供了强大的动画编辑功能。支持视频剪切、图像搜索过滤、文本动画库、图层蒙版等功能。 一、项目背景与特点 开源项目&#xff1a;Motionity是一个开源项目&…

docker push 推送镜像到阿里云仓库

1.登陆阿里云 镜像服务&#xff0c;跟着指引操作就行 创建个人实例&#xff0c;创建命名空间、镜像仓库&#xff0c;绑定代码源头 2.将镜像推送到Registry $ docker login --username*** registry.cn-beijing.aliyuncs.com $ docker tag [ImageId] registry.cn-beijing.aliy…

全国青少年软件编程等级考试-四级-奇偶之和(真题)

题目&#xff1a;奇偶之和 1.准备工作 (1)保留舞台中的小猫角色&#xff1b; 2.功能实现 (1)分别计算1&#xff5e;100中&#xff0c;奇数之和&#xff0c;偶数之和&#xff1b; (2)说出奇数之和&#xff0c;偶数之和。 讲解&#xff1a; 1、如何判断奇偶数 奇数是指除以2有…

「媒体邀约」全国巡演,多地推介会,如何做好媒体宣传

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 媒体宣传加速季&#xff0c;100万补贴享不停&#xff0c;一手媒体资源&#xff0c;全国100城线下落地执行。详情请联系胡老师。 我们在做多地活动的时候&#xff0c;比如演唱会&#xff…

Qt 基础组件速学 interView框架

学习目标&#xff1a; interView理解和自定义模型操作 前置环境 运行环境:qt creator 4.12 学习内容&#xff1a; interView是一个具有插件架构的Qt应用程序框架,它旨在提供一个易于扩展和定制的应用程序开发解决方案。 在interView框架中,这三者协作的方式如下: 视图类从…

【Python系列】数字的bool值

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java | Leetcode Java题解之第218题天际线问题

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> getSkyline(int[][] buildings) {PriorityQueue<int[]> pq new PriorityQueue<int[]>((a, b) -> b[1] - a[1]);List<Integer> boundaries new ArrayList&l…

Spring Boot Vue 毕设系统讲解1

项目结构 包说明 db&#xff1a;文件夹是存放数据脚本文件的 annotation&#xff1a; 系统自定义注解 config&#xff1a;系统定义的配置类 controller&#xff1a; 系统接口控制器类 dao&#xff1a; 系统dao类编写数据库查询方法和数据库交互 entity&#xff1a;数据库…

Fastapi 项目第二天首次访问时数据库连接报错问题Can‘t connect to MySQL server

问题描述 Fastapi 项目使用 sqlalchemy 连接的mysql 数据库&#xff0c;每次第二天首次访问数据库相关操作&#xff0c;都会报错&#xff1a;sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, “Can’t connect to MySQL server on ‘x.x.x.x’ ([Err…

C++deque容器

文章目录 deque容器概念deque操作deque对象的带参数构造deque头部和末尾的添加移除操作deque的数据存取deque与迭代器deque赋值deque插入deque删除 deque容器概念 deque是双端数组&#xff0c;而vector是单端的。 deque头部和尾部添加或移除元素都非常快速, 但是在中部安插元…

ceph-volume inventory KeyError: ‘TYPE‘ 处理

是否有人跟我一样碰到这样的情况 执行ceph-volume inventory报错 还好有错误日志可以看 [2024-07-05 11:40:40,540][ceph_volume.process][INFO ] Running command: /usr/sbin/blkid -c /dev/null -p /dev/ceph-c5fd6684-3851-49ab-bd44-f6743a79e24f/osd-block-42d41cd1-82…

爬虫进阶:Selenium与Ajax的无缝集成

爬虫与Ajax的挑战 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分内容。这为用户带来了更好的体验&#xff0c;但同时也使得爬虫在抓取数据时面临以下挑战&#xff1a; 动态内容加载&#xff…

伪元素content追加文字使用小技巧

E::before和E::after本身的作用是追加字&#xff0c;直接在文字后面追加链接 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

使用myCobot280和OAK-D OpenCV DepthAI摄像头制作一个实时脸部跟踪的手机支架!

引言 由于YouTube和Netflix的出现&#xff0c;我们开始躺着看手机。然而&#xff0c;长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架&#xff0c;让你无需用手拿着手机。请务必试试&#xff01; 准备工作 这次我们…

bpftrace几种使用实例

1. 排查内存泄漏 memory.c memory.bt 可以执行相关memory&#xff0c;用bpftrace追踪malloc和free的过程 修改memory.bt&#xff0c;加上malloc和free统计&#xff0c;重新执行 2. 验证tcp连接关闭是应用关闭还是内核关闭 nginx服务启动后&#xff0c;会处于监听状态&…