「技术分享」Unity使用SQLite数据库存储本地数据
liuian 2024-12-07 14:59 18 浏览
前言
- 单机游戏开发过程中,一款高效便捷的本地数据存储库一定是必不可少的。今天介绍unity结合SQLite数据库来完成本地数据的存储。
开发环境
- 引擎:Unity 2018.4.16f1
- 插件:sqlitekit
SQLite的优势
- SQLite是一种嵌入式数据库,它的数据库就是一个文件。
- 基于sqlitekit可实现跨平台本地数据存储,不用过多考虑跨平台问题
- 基于sqlitekit可实现数据加密存储,能有效的提高本地数据的安全
- 实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎
相关逻辑及关键代码
- 创建db库文件:在编辑器模式下创建属于自己工程的db库文件,将其放入StreamingAssets文件夹下,便于后续开发以及打包对应平台后将库文件移植到对应平台的可读可写文件夹下。
SQLiteDB sqLiteDb = new SQLiteDB();
string filename = Application.streamingAssetsPath + "/gameSql.db";
if (System.IO.File.Exists(filename))
{
System.IO.File.Delete(filename);
}
sqLiteDb.Open(filename);
- 创建数据表:根据需求创建一张用于存储数据的表单,创建成功后相应的数据就可通过增删改查来修改表内的数据内容了。
//id INTEGER PRIMARY KEY设置自增Id,DataKey BIGINT, Data BLOB,Size INT表示 字段名称 字段类型,字段名称 字段类型,字段名称 字段类型
string query_create = #34;{CREATE TABLE IF NOT EXISTS}{表名}(id INTEGER PRIMARY KEY, DataKey BIGINT, Data BLOB,Size INT);";
SQLiteQuery query = new SQLiteQuery(sqLiteDb, password);
query.Step();
query.Release();
query = new SQLiteQuery(sqLiteDb, queryCreate);
query.Step();
query.Release();
- 数据表内插入数据:向已经创建好的表内插入一行新的数据
string data = "需要存储的数据";
long id
string queryInsert = #34;INSERT INTO{tableName} (DataKey,Data) VALUES(?,?);";
SQLiteQuery query = new SQLiteQuery(sqLiteDb, password);
query.Step();
query.Release();
query = new SQLiteQuery(sqLiteDb, queryInsert);
query.Bind(id);
query.Bind(data);
query.Step();
query.Release();
netData.OnRecycling();
- 更新数据表内已有的数据:表内已有存储好的数据,对其数据进行更新修改
long id = 存储数据的key值
string data = "需要存储的数据";
string query_update = #34;UPDATE {表名} SET Data = ? WHERE DataKey = ?;";//
SQLiteQuery query = new SQLiteQuery(sqLiteDb, password);
query.Step();
query.Release();
query = new SQLiteQuery(sqLiteDb, query_update);
query.Bind(data);
query.Bind(id);
query.Step();
query.Release();
- 查找数据表内的数据:查询数据表内的数据内容,未查询到数据时返回空数据
string value = string.Empty;
long id = 存储数据的key值
//若删除 WHERE DataKey = ?将查询整张表内的数据
string query_select = #34;SELECT * FROM {表名} WHERE DataKey = ?;";
SQLiteQuery query = new SQLiteQuery(sqLiteDb, password);
query.Step();
query.Release();
query = new SQLiteQuery(sqLiteDb, query_select);
query.Bind(id);
if (query.Step())
{
value = query.GetBlob("Data");
}
query.Release();
- 删除数据表内的数据:将数据表内的数据删除掉(删除有风险,谨防删库跑路事件发送)。
long id = 存储数据的key值
//若删除 WHERE DataKey = ?将删除整张表内的数据
string query_delete = #34;DELETE FROM {表名} WHERE DataKey = ?;";
SQLiteQuery query = new SQLiteQuery(sqLiteDb, password);
query.Step();
query.Release();
query = new SQLiteQuery(sqLiteDb, query_delete);
query.Bind(id);
query.Step();
query.Release();
- 关闭数据数据库:退出程序时记得将数据库关闭释放
sqLiteDb.Close();
- 打包后安卓和ios移动平台需要将db文件放入可读可写文件夹下
string outFile = string.Empty;
#if UNITY_ANDROID
outFile = Application.persistentDataPath + "/gameSql.db";
#elif UNITY_IPHONE
outFile = "file://" + Application.persistentDataPath + "/gameSql.db";
#endif
string resPath = Application.streamingAssetsPath + "/gameSql.db";
if (File.Exists(outFile)) File.Delete(outFile);
UnityWebRequest request = UnityWebRequest.Get(resPath);
request.timeout = 30;
yield return request.SendWebRequest();
System.IO.File.WriteAllBytes(outFile,request.downloadHandler.data);
结束语
- 灵活运用sqlitekit能使自己的本地数据存储更加便利,后续会介绍sqlitekit和protobuf结合在Unity中的使用。
相关推荐
- MySQL合集-mysql5.7及mysql8的一些特性
-
1、Json支持及虚拟列1.1jsonJson在5.7.8原生支持,在8.0引入了json字段的部分更新(jsonpartialupdate)以及两个聚合函数,JSON_OBJECTAGG,JS...
- MySQL 双表架构在房产中介房源管理中的深度实践
-
MySQL房源与价格双表封神:降价提醒实时推送客户房产中介实战:MySQL空间函数精准定位学区房MySQL狠招:JSON字段实现房源标签自由组合筛选房源信息与价格变更联动:MySQL黄金搭档解决客户看...
- MySQL 5.7 JSON 数据类型使用总结
-
从MySQL5.7.8开始,MySQL支持原生的JSON数据类型。MySQL支持RFC7159定义的全部json数据类型,具体的包含四种基本类型(strings,numbers,boolea...
- MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
-
前言提到SQL优化,大多数人想到的还是那些经典套路:建索引、避免全表扫描、优化JOIN顺序…这些确实是基础,但如果你还停留在MySQL5.7时代的优化思维,那就out了。MySQL8.0已经发布好...
- 如何在 MySQL 中使用 JSON 数据(mysql的json函数与实例)
-
在MySQL中学习“NoSQL”MySQL从5.7版本开始就支持JSON格式的数据类型,该数据类型支持JSON文档的自动验证和优化存储和访问。尽管JSON数据最好存储在MongoDB等...
- MySQL中JSON的存储原理(mysql中json字段操作)
-
前言:表中有json字段后,非索引查询性能变得非常糟糕起因是我有一张表,里面有json字段后,而当mysql表中有200w数据的时候,走非索引查询性能变得非常糟糕需要3到5s。因此对mysql的jso...
- mysql 之json字段详解(多层复杂检索)
-
MySQL5.7.8开始支持JSON数据类型。MySQL8.0版本中增加了对JSON类型的索引支持。示例表CREATETABLE`users`(`id`intNOTNULLAU...
- VMware vCenter Server 8.0U3b 发布下载,新增功能概览
-
VMwarevCenterServer8.0U3b发布下载,新增功能概览ServerManagementSoftware|vCenter请访问原文链接:https://sysin.or...
- Spring Boot 3.x 新特性详解:从基础到高级实战
-
1.SpringBoot3.x简介与核心特性1.1SpringBoot3.x新特性概览SpringBoot3.x是建立在SpringFramework6.0基础上的重大版...
- 如何设计Agent的记忆系统(agent记忆方法)
-
最近看了一张画Agent记忆分类的图我觉得分类分的还可以,但是太浅了,于是就着它的逻辑,仔细得写了一下在不同的记忆层,该如何设计和选型先从流程,作用,实力和持续时间的这4个维度来解释一下这几种记忆:1...
- Spring Boot整合MyBatis全面指南:从基础到高级应用(全网最全)
-
一、基础概念与配置1.1SpringBoot与MyBatis简介技术描述优点SpringBoot简化Spring应用开发的框架,提供自动配置、快速启动等特性快速开发、内嵌服务器、自动配置、无需X...
- 5大主流方案对比:MySQL千亿级数据线上平滑扩容实战
-
一、扩容方案剖析1、扩容问题在项目初期,我们部署了三个数据库A、B、C,此时数据库的规模可以满足我们的业务需求。为了将数据做到平均分配,我们在Service服务层使用uid%3进行取模分片,从而将数据...
- PostgreSQL 技术内幕(五)Greenplum-Interconnect模块
-
Greenplum是在开源PostgreSQL的基础上,采用MPP架构的关系型分布式数据库。Greenplum被业界认为是最快最具性价比的数据库,具有强大的大规模数据分析任务处理能力。Greenplu...
- 在实际操作过程中如何避免出现SQL注入漏洞
-
一前言本文将针对开发过程中依旧经常出现的SQL编码缺陷,讲解其背后原理及形成原因。并以几个常见漏洞存在形式,提醒技术同学注意相关问题。最后会根据原理,提供解决或缓解方案。二SQL注入漏洞的原理、形...
- 运维从头到尾安装日志服务器,看这一篇就够了
-
一、rsyslog部署1.1)rsyslog介绍Linux的日志记录了用户在系统上一切操作,看日志去分析系统的状态是运维人员必须掌握的基本功。rsyslog日志服务器的优势:1、日志统一,集中式管理...
- 一周热门
-
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
python使用fitz模块提取pdf中的图片
-
- 最近发表
-
- MySQL合集-mysql5.7及mysql8的一些特性
- MySQL 双表架构在房产中介房源管理中的深度实践
- MySQL 5.7 JSON 数据类型使用总结
- MySQL 8.0 SQL优化黑科技,面试官都不一定知道!
- 如何在 MySQL 中使用 JSON 数据(mysql的json函数与实例)
- MySQL中JSON的存储原理(mysql中json字段操作)
- mysql 之json字段详解(多层复杂检索)
- VMware vCenter Server 8.0U3b 发布下载,新增功能概览
- Spring Boot 3.x 新特性详解:从基础到高级实战
- 如何设计Agent的记忆系统(agent记忆方法)
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- table.render (33)
- uniapp textarea (33)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)