在Unity中使用SQLite保存配置表数据(For Lua)
在Lua中使用sqlite
Lua版本Sqlite文档:http://lua.sqlite.org/index.cgi/doc/tip/doc/lsqlite3.wiki
sqlite官网:https://www.sqlite.org/index.html
用途
- 把游戏中的配置表数据存储到sqlite中
- 存储游戏中的聊天记录
sqlite的优点
提高游戏的启动速度,在游戏启动时,不需要去加载配置文件,而是在用到时,从sqlite中读取,大大提高启动速度。
运行环境
我们是把sqlite编译进xlua的lib(.so)在lua中调用,没有通过mono提供的sqlite接口访问
我的运行环境如下(说明:文章写于2017年6月1日,在草稿箱一直未发布)
XLua: v2.1.6
Unity :5.3.7
luasqlite版本:sqlite 3
使用示例
创建表并查询
表的创建,添加数据,查询
--a simple libsqlite3 binding for lua5.0-5.2 that provides 3 functions only and is still fully functional: local db = lsqlite.open(database) results, err = db:exec(statments) db:close()
require("lsqlite")
-- open an in memory database
db = lsqlite.open(":memory:")
-- open a file
-- open an inaccessible file
-- db = lsqlite.open("/root/test.db")
-- check if we got an handle
if not db then print("could not open the database") return end
db:exec("drop table 'my_table';")
db:exec("create table 'my_table' ( 'a', 'b' );")
db:exec("insert into 'my_table' values ( 1, 2 );")
db:exec("insert into 'my_table' values ( 3, 4 );")
db:exec("insert into 'my_table' values ( 5, 6 );")
db:exec("insert into 'my_table' values ( -111, -222 );")
results, err=db:exec("select * from 'my_table';")
print(err, results)
local sum=0
for i = 1, #results do
for k, v in pairs( results[i] ) do
print( i, k, v )
sum=sum+v
end
end
print("sum: " .. sum)
db:close()
更多例子:https://docs.coronalabs.com/api/library/sqlite3/index.html
判断某张表是否存在
如果使用sqlite的语法,在lua版本中是无效的。
解决办法:使用xpcall捕获异常
数据查询
---比如select(query)功能
for row in self.db:nrows('SELECT * FROM '..tableName..' where '..idKey..'="'..value..'"') do
--- row就是一行数据
end
对表的操作
---对table的操作,通常用于insert,update,append,create
self.db:exec(sql)
注意事项
sqlite的部分功能在lua中并不能完全使用
遇到问题
no lsqlite
直接在lua环境下,'require lsqlite`,报找不到lsqlite,需要导入sqlite,可以把它编译到xlua.so中
no field package.preload['lsqlite']
no such builtin lib 'lsqlite'
no such file 'lsqlite' in CustomLoaders!
no such resource 'lsqlite.lua'
no file 'C:\Program Files\Unity_5_3_7_p4\Editor\lua\lsqlite.lua'
no file 'C:\Program Files\Unity_5_3_7_p4\Editor\lua\lsqlite\init.lua'
no file 'C:\Program Files\Unity_5_3_7_p4\Editor\lsqlite.lua'
no file 'C:\Program Files\Unity_5_3_7_p4\Editor\lsqlite\init.lua'
no file 'C:\Program Files\Unity_5_3_7_p4\Editor\..\share\lua\5.3\lsqlite.lua'
no file 'C:\Program Files\Unity_5_3_7_p4\Editor\..\share\lua\5.3\lsqlite\init.lua'
在Unity的lua环境无法close所有连接,导致Unity锁定db
查看文档:http://lua.sqlite.org/index.cgi/doc/tip/doc/lsqlite3.wiki#db_close
使用db:close和db:close_vm() 都无法完全关闭db的连接
编辑db文件,提示database被锁定
解决办法:通过在Unity的C#层进行Close
我的经验分享
把配置表分成多个db
经实测在移动设备或模拟器上执行Update/Create Table等SQL语句,性能非常差,执行一次热更新SQL约需要15s而直接下载并替换db则会快很多,所以我推荐直接替换db文件。
因为当有数据更新时是替换db,建议把经常修改的配置表放在一个db中,不常修改的放另一个db,也就是把数据存在多个db中。
根据我从业三个rpg游戏项目的经验,最常修改的部分有:
- 语言包
- 任务表
- 道具表(装备,物品等等这些)
- 新手引导
- 自宝义配置表(key/value形式的表)
- 活动表(充值/节日/节日活动表,部分数据放配置,部分配置协议下发)
在Unity中使用SQLite保存配置表数据(For Lua)的更多相关文章
- Spring中添加新的配置表,并对新的配置表进行处理
实习过程中boss交代的任务(以下出现的代码以及数据只给出小部分,提供一个思路) 目的:Spring中添加新的配置表,并对新的配置表进行处理:替换的新的配置表要友好,同时保证替换前后功能不能发生变化. ...
- SE16传输配置表数据
SE16标准工具传输配置表数据 (上面说了配置表,所以并不是所有的表都能SE16传输.) 了解到: 1.如果是可维护的表,SE16,执行 然后:表条目->传输条目.选择请求: 2.对于不可维护的 ...
- SQLite Expert 删除表数据并重置自动增长列
用下面的语句肯定是行不通的,语句不支持 truncate table t_Records 方法:1.删除表数据 2.重置自动增长列 where name='t_Records' /*name :是表名 ...
- SQL Server中的Merge关键字 更新表数据
简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...
- 在GridControl表格控件中实现多层级主从表数据的展示
在一些应用场景中,我们需要实现多层级的数据表格显示,如常规的二级主从表数据展示,甚至也有多个层级展示的需求,那么我们如何通过DevExpress的GridControl控表格件实现这种业务需求呢?本篇 ...
- Unity中建立文本保存数据
public void CreateYunYD() { GameToolsManager.Instance.effectType = EFFECTTYPE.YunYD; CreateYunOrWu(& ...
- sqlite学习笔记8:C语言中使用sqlite之创建表
前面已经说了怎样打开和关闭数据库,这次要说得是怎样运行SQL语句,来创建一张表. 要用的的函数: sqlite3_exec(sqlite3* db, const char *sql, sqlite_c ...
- unity中Android环境变量配置
http://www.cnblogs.com/windytrees/p/7533477.html
- Django中ORM简介与单表数据操作
一. ORM简介 概念:.ORM框架是用于实现面向对象编程语言种不同类型系统的数据之间的转换 构建模型的步骤:重点 (1).配置目标数据库信息,在seting.py中设置数据库信息 DATABASE ...
- SQLite 如何清空表数据并将递增量归零
SQLite并不支持TRUNCATE TABLE语句 方式一: DELETE FROM [Tab_User] --不能将递增数归零 方式二: DELETE FROM sqlite_sequence W ...
随机推荐
- Axure 二维码扫码
基础布局 1.一个300X395的黑底黑框矩形,不透明度为20%,命名为"背景框": 2.一个150X150的白底白框矩形,不透明度为70%,命名为"扫描框": ...
- 大数据 - ODS&DWD&DIM-SQL分享
大数据 ODS&DWD&DIM-SQL分享 需求 思路一:等差数列 断2天.3天,嵌套太多 1.1 开窗,按照 id 分组,同时按照 dt 排序,求 Rank -- linux 中空格 ...
- Linux 创建新用户
添加用户组[root@VipSoft ~]#groupadd admin 添加用户[root@VipSoft ~]#useradd jimmy -m -d /home/jimmy -g admin 修 ...
- 阿里云的“终端云化”实践,基于ENS进行边缘架构构建
终端无休止的更新迭代,是软件对计算资源的需求激增. 作者|王广芳 编辑|IMMENSE 终端云化:打破硬件的桎梏 近几年,"终端云化"技术开始规模化落地,其核心思想是"计 ...
- MMSC 扩充物料库存地点
当涉及到物料的库存地点时,系统通常会做校验,该物料是否扩充了库存地点,没有扩充则报错.为了不使这样的错误干扰到程序逻辑,通常会在涉及时,先查询MARD表,判断是否存在对应的库存地点.如果没有存在,则直 ...
- Spring Cloud Alibaba 2.2.6发布:新增Nacos注册快速失败的配置
7月12日消息,Spring Cloud Alibaba新版本2.2.6发布,该版本适配Spring Cloud Hoxton.SR9. 下面一起来看看该版本内容: 特性增强 Nacos 支持服务注册 ...
- Codeforces Round #717 (Div. 2) 个人题解 A~C (A思維,B位運算,C背包DP)
1516A. Tit for Tat 題意: 給定大小為 \(n\) 的數組和可操作次數 \(k\) , 每次操作都選定兩個數(如果 \(1 \le a_i\) ),使第一個數 - \(1\) ,另一 ...
- 创新推出 | Serverless 调试大杀器:端云联调
背景 说起当前最火一个技术, 不可避免地讨论到一个概念: Serverless.作为一种新型的应用架构,Serverless 让我们摆脱了维护基础设施的繁琐,只需要上传代码包或者镜像, 即可得到一个弹 ...
- springBoot项目打jar包
系列导航 springBoot项目打jar包 1.springboot工程新建(单模块) 2.springboot创建多模块工程 3.springboot连接数据库 4.SpringBoot连接数据库 ...
- 报错:for..in loops iterate over the entire prototype chain, which is virtually never what you want.
for..in loops iterate over the entire prototype chain, which is virtually never what you want. 意思是使用 ...