【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/02
		2020-09-02
	blob:二进制
	...
约束:
		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 by
			eg:
				select age,cout(*) from stu group by age;//查询每个年龄的人数
	范围查询:
		between ... and ...
			eg:	
				select *from stu where age between 10 and 20;
	去重:
		distinct
			eg:
				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.mfbz.cn/a/779210.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 22.04远程自动登录桌面环境

如果需要远程自动登录桌面环境&#xff0c;首先需要将Ubuntu的自动登录打开&#xff0c;在【settings】-【user】下面 然后要设置【Sharing】进行桌面共享&#xff0c;Ubuntu有自带的桌面共享功能&#xff0c;不需要另外去安装xrdp或者vnc之类的工具了 点开【Remote Desktop】…

解决IDEA每次新建项目都需要重新配置maven的问题

每次打开IDEA都要重新配置maven&#xff0c;这是因为在DEA中分为项目设置和全局设置&#xff0c;这个时候我们就需要去到全局中设置maven了。我用的是IntelliJ IDEA 2023.3.4 (Ultimate Edition)&#xff0c;以此为例。 第一步&#xff1a;打开一个空的IDEA&#xff0c;选择左…

大学生电子设计大赛超全资料分享

超全大学生电子设计大赛项目合集免费分享 电赛竞赛资料大全&#xff0c;新增竞赛空间电子设计资料。包含嵌入式硬件和软件开发的学习资料&#xff0c;包括PCB教程&#xff0c;单片机例程&#xff0c; 单片机课程设计毕业设计参考资料、项目设计方案&#xff0c;源码和开发文档…

孟德尔随机化 --痛风与酒精消耗量

写在前面 最近看了微信公众号&#xff0c;jimmy谈到生信与基础之间&#xff0c;个人觉得生信与基础技术是无高低之分的&#xff0c;本质上都是科研中为了证实结果的一个工具。生信的实质是用计算机分析数据&#xff0c;接触基础比较好&#xff0c;感觉是实验操作。分析上游为实…

初学嵌入式是弄linux还是单片机?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;1、先入门了51先学了89c52…

Windows安装超好用的截图工具——Snipaste

1、下载 官网&#xff1a;https://zh.snipaste.com/ 2、安装 &#xff08;1&#xff09;解压下载的压缩包 &#xff08;2&#xff09;选中Snipaste.exe文件&#xff0c;右键发送到 -- > 桌面快捷方式 &#xff08;3&#xff09;双击桌面Snipaste图标&#xff0c;桌面右下…

3.js - 裁剪平面(clipIntersection:交集、并集)

看图 代码 // ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js// 导入tween import …

docker部署onlyoffice,开启JWT权限校验Token

原来的部署方式 之前的方式是禁用了JWT&#xff1a; docker run -itd -p 8080:80 --name docserver --network host -e JWT_ENABLEDfalse --restartalways onlyoffice/documentserver:8 新的部署方式 参考文档&#xff1a;https://helpcenter.onlyoffice.com/installation/…

实验1 主成分分析

目 录 二、实验环境... 1 三、实验内容... 1 3.1 导入数据... 2 3.2 求相关系数矩阵.. 3 3.3 数据规范化处理.. 3 3.4 主成分分析... 4 四 实验心得... 5 一、实验目的 &#xff08;1&#xff09;理解主成分分析的思想&#xff1b; &#xff08;2&#xff09;掌握主成分分析方…

Python 异步编程介绍与代码示例

Python 异步编程介绍与代码示例 一、异步编程概述 异步编程是一种编程范式&#xff0c;它旨在处理那些需要等待I/O操作完成或执行耗时任务的情况。在传统的同步编程中&#xff0c;代码会按照顺序逐行执行&#xff0c;直到遇到一个耗时操作&#xff0c;它会阻塞程序的执行直到…

测试人应该懂的!自动化测试必会之数据驱动测试

数据驱动测试 在实际的测试过程中&#xff0c;我们会发现好几组用例都是相同的操作步骤&#xff0c;只是测试数据的不同&#xff0c;而我们往往需要编写多次用例来进行测试&#xff0c;此时我们可以利用数据驱动测试来简化该种操作。 参数化&#xff1a; 输入数据的不同从而产…

【云计算】公有云、私有云、混合云、社区云、多云

公有云、私有云、混合云、社区云、多云 1.云计算的形态1.1 公有云1.2 私有云1.3 混合云1.4 社区云1.5 多云1.5.1 多云和混合云之间的关系1.5.2 多云的用途1.5.3 影子 IT 和多云1.5.4 优缺点 2.不同云形态的对比 1.云计算的形态 张三⾃⼰在家做饭吃&#xff0c;这是 私有云&…

非堆成加密是公私钥使用

对称加密学习-CSDN博客 加密算法学习-CSDN博客 非对称加密算法使用一对密钥&#xff0c;包括一个公钥和一个私钥&#xff0c;它们是数学上相关联的&#xff0c;但公钥可以公开分享&#xff0c;而私钥必须保密。以下是使用非对称加密算法的一般步骤&#xff1a; 密钥生成&…

Spring相关面试题(四)

49 JavaConfig方式如何启用AOP?如何强制使用cglib&#xff1f; 在JavaConfig类&#xff0c;加上EnableAspectJAutoProxy 如果要强制使用CGLIB动态代理 &#xff0c;加上(proxyTargetClass true) 加上(exposeProxy true) 就是将对象暴露到线程池中。 50 介绍AOP在Spring中…

打开浏览器控制台,点击应用,浏览器崩溃

调试的时候&#xff0c;打开控制台&#xff0c;点击 “应用” 立马浏览器奔溃&#xff0c;但是点击别的没问题 调查发现是因为manifest.json这个文件引起的 manifest.json 最主要的原因是因为没有设置这个sizes字段 Google浏览器更新大概到126之后的版本会有问题&#xff0c;之…

关于CPU你一定要注意的重要参数,警惕韭菜陷阱

昨天遇到个奇葩事&#xff0c;有个粉丝喷我“懂不懂什么叫I9&#xff1f;”言下之意就是CPU中I9>i7>I5>I3&#xff0c;我也不知道咋说&#xff0c;只是提醒大家小心被坑&#xff0c;花了多的钱用的差的性能。作为回应&#xff0c;仅以此篇说下CPU咱们臭打游戏一定要知…

新手学Cocos报错 [Assets] Failed to open

两个都在偏好设置里面调&#xff08;文件下面的偏好设置&#xff09;&#xff1a; 1.设置中文&#xff1f; 2.报错 [Assets] Failed to open&#xff1f; 这样在点击打开ts文件的时候就不会报错&#xff0c;并且用vscode编辑器打开了&#xff0c; 同样也可以改成你们自己喜欢…

彻底解决Path with “WEB-INF“ or “META-INF“: [WEB-INF/views/index.jsp]

背景描述 项目使用的是springboot2jsp的架构。以前好好的项目复制了一份&#xff0c;然后就无法访问报错。百度了好久都乱七八糟的&#xff0c;还没有解决问题。错误消息如下&#xff1a; 2024-07-05 15:45:51.335 INFO [http-nio-12581-exec-1]org.springframework.web.ser…

【Selenium配置】WebDriver安装浏览器驱动(ChromeEdge)

【Selenium配置】WebDriver安装浏览器驱动&#xff08;Chrome&Edge&#xff09; 文章目录 【Selenium配置】WebDriver安装浏览器驱动&#xff08;Chrome&Edge&#xff09;Chrome确认Chrome版本下载对应driver把解压后的chromedriver文件放在chrome安装目录下&#xff0…

字节跳动与南开联合开源 StoryDiffusion:一键生成漫画和视频故事的神器!完全免费!

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 漫画&#xff0c;是多少人童年的回忆啊&#xff01; 记得小学…