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

news2024/11/18 16:41:11

在这里插入图片描述


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

👨‍💻 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.coloradmin.cn/o/1900201.html

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

相关文章

驱动新质生产力发展:绿色算力有了科学评价标准

在席卷全球的人工智能大潮中&#xff0c;人工智能技术与实体经济的融合&#xff0c;不仅是驱动新质生产力发展的引擎&#xff0c;而且正在以磅礴之势推动千行百业的数字化转型。 而作为人工智能的关键要素&#xff0c;绿色算力在引领科技进步、带动产业升级、培育新质生产力中发…

基于Oauth2.0的OpenFeign远程调用

目录 前言 1.引入openfeign相关依赖 2.开启openFeign远程调用&#xff0c;在启动类头加上注解即可 3. 提供远程调用接口&#xff0c;接口名称必须与controler名称保持一致 4.远程调用关键代码 4.1 注入restTemplate 4.2 配置拦截器 4.3 设置请求头 4.4 获取请求结果 4.5 远…

鸿蒙笔记导航栏,路由,还有axios

1.导航组件 导航栏位置可以调整&#xff0c;导航栏位置 Entry Component struct t1 {build() {Tabs(){TabContent() {Text(qwer)}.tabBar("首页")TabContent() {Text(发现内容)}.tabBar(发现)TabContent() {Text(我的内容)}.tabBar("我的")}// 做平板适配…

“郭有才”商标主要类别都已被注册!

前阵山东网红“郭有才”火遍大江北&#xff0c;当然少不了许多想去申请注册“郭有才”商标名称的&#xff0c;普推商标知产老杨检索&#xff0c;发现“郭有才”商标申请了43个类别&#xff0c;基本上类别都被申请注册&#xff0c;已注册的商标大多是在“郭有才”火之前申请注册…

Qt 基础组件速学 鼠标和键盘事件

学习目标&#xff1a; 鼠标事件和键盘事件应用 前置环境 运行环境:qt creator 4.12 学习内容和效果演示&#xff1a; 1.鼠标事件 根据鼠标的坐标位置&#xff0c;做出对应的事件。 2.键盘事件 根据键盘的输入做出对应操作 详细主要代码 1.鼠标事件 #include "main…

#商铺出租数据#2024年6月北上广深成渝对比情况

#商铺出租数据#2024年6月北上广深成渝对比情况&#xff1a; 根据某8平台不完全样本统计&#xff0c;北上广深成渝商铺每平米月租金从高到低依次为 北京218.7元、上海212.1元、深圳159.3元、广州145.8元、成都138.6元、重庆104.1元。 地区 区县 日期 类型 数值 上海 全城 202…

开发必备基础知识【字符编码合集】

开发必备基础知识【字符编码合集】 大家在日常开发交流中会发现&#xff0c;别人那里运行的好好的文件&#xff0c;在你电脑上却无法编译&#xff0c;甚至出现一堆莫名其妙的字符&#xff0c;比如&#xff1a;&#xfffd;&#xfffd;&#xfffd; 程序中经常遇到一些关于乱码…

开发笔记:vue3+ts+vant 卡片数据分页,下拉加载,卡片左滑可删除

效果&#xff1a; 实现 使用vantui组件 van-swipe-cell van-card &#xff08;商品卡片&#xff09; 核心代码 const currentPage ref(1) const pageSize ref(4) const totalSize ref(10) const loading ref(false) const finished ref(false) const refreshing ref(…

商务办公优选!AOC Q27E3S2商用显示器,打造卓越新体验!

摘要&#xff1a;助办公室一族纵横职场&#xff0c;实现高效舒适办公&#xff01; 在日常商务办公中&#xff0c;对于办公室一族来说总有太多“难难难难难点”&#xff1a;工作任务繁琐&#xff0c;熬夜加班心力交瘁、长时间伏案工作导致颈椎、眼睛等出现问题&#xff0c;职业…

SQL Server 2022数据库对象

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 数据库对象是数据库的组成部分&#xff0c;数据表、视图、索引、存储过程以及触发器等都是数据库对象。 &#xff08;1&#xff09;数据库的主要对象是数据表&#xff0c;数据表是一…

基于LabVIEW的设备安装螺栓连接设计

介绍了一种基于LabVIEW的辅助设备安装螺栓连接设计案例。通过LabVIEW软件&#xff0c;实现了从螺栓规格预估、强度校核到物料选用的整个流程的软件化&#xff0c;提高了设计效率和安装可靠性。 项目背景 在轨道车辆设备安装中&#xff0c;螺栓连接作为一种常见的紧固方式&…

MSPM0G3507——读取引脚的高低电平方法(数字信号循迹模块)

SYSCFG配置 代码部分 //第一个传感器if( DL_GPIO_readPins(xunji_PORT_PIN1_PORT , xunji_PORT_PIN1_PIN )xunji_PORT_PIN1_PIN) //黑&#xff0c;不亮 高{a1;}if( DL_GPIO_readPins(xunji_PORT_PIN1_PORT , xunji_PORT…

C++开发调试工具:GDB调试,windebug调试,adb调试

我们在C开发过程中时常避免不了要调试追踪&#xff0c;一下介绍最主流的三种调试工具&#xff1a; 一.GDB调试 1.coredump文件&#xff1a; coredump文件是程序异常时系统产生的错误日志文件&#xff0c;即核心转储文件&#xff1b; 编译一个debug程序&#xff0c;必须是debu…

Appium元素定位(全网详细讲解)(二)

1.appium inspector&#xff08;定位元素的工具&#xff09;使用方法 详细介绍&#xff1a; 详细解释&#xff1a; 图标名称说明1Show Element Handles是否显示元素句柄2Select Elements选择元素定位3Tap/Swipe By Coordinates按坐标点击/滑动4Download Screenshot下载屏幕截…

Nginx-http_auth_basic_module使用

文章目录 前言一、ngx_http_auth_basic_module二、指令1.auth_basic1.auth_basic_user_file 示例生成密码文件配置basic认证浏览器验证 总结 前言 nginx可以通过HTTP Basic Authutication协议进行用户名和密码的认证。 一、ngx_http_auth_basic_module 生效阶段&#xff1a; …

科普文:如何进行有效沟通

概叙 你会沟通吗&#xff1f; 你知道正确的沟通应该怎么做吗&#xff1f; 在日常生活和工作中&#xff0c;不会沟通带来的困扰是否让你感同身受&#xff1f; 在工作中&#xff0c;你是否因表达不清让观点无法被同事理解和采纳&#xff0c;影响职业发展&#xff1f; 与上级交流是…

GuLi商城-商品服务-API-品牌管理-云存储开通与使用

这里学习下阿里云对象存储 地址&#xff1a;对象存储 OSS_云存储服务_企业数据管理_存储-阿里云 登录支付宝账号&#xff0c;找到了我以前开通的阿里云对象存储 熟悉下API 文档中心 简介_对象存储(OSS)-阿里云帮助中心 我们将用这种方式上传阿里云OSS

C++怎么解决不支持字符串枚举?

首先&#xff0c;有两种方法&#xff1a;使用命名空间和字符串常量与使用 enum class 和辅助函数。 表格直观展示 特性使用命名空间和字符串常量使用 enum class 和辅助函数类型安全性低 - 编译器无法检查字符串有效性&#xff0c;运行时发现错误高 - 编译期类型检查&#xf…

爆破片和安全阀

一、爆破片介绍 爆破片是一种用于安全释放压力的结构&#xff0c;通常应用于压力容器、管道和设备中&#xff0c;以防止由于压力过高而导致的灾难性故障。在压力超过设定值时&#xff0c;爆破片会破裂&#xff0c;从而迅速将过压泄放&#xff0c;保护设备和人员安全 爆破片通常…

Java——IO流(二)-(4/7):不同编码读取乱码的问题,转换流-InputStreamReader、OutputStreamWriter

目录 不同编码读取出现乱码的问题 转换流 InputStreamReader(字符输入转换流) 实例演示(1) OutputStreamWriter(字符输出转换流) 实例演示(2) 不同编码读取出现乱码的问题 如果代码编码和被读取的文本文件的编码是一致的&#xff0c;使用字符流读取文本文件时不会出现乱…