在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游戏项目的经验,最常修改的部分有:

  1. 语言包
  2. 任务表
  3. 道具表(装备,物品等等这些)
  4. 新手引导
  5. 自宝义配置表(key/value形式的表)
  6. 活动表(充值/节日/节日活动表,部分数据放配置,部分配置协议下发)

在Unity中使用SQLite保存配置表数据(For Lua)的更多相关文章

  1. Spring中添加新的配置表,并对新的配置表进行处理

    实习过程中boss交代的任务(以下出现的代码以及数据只给出小部分,提供一个思路) 目的:Spring中添加新的配置表,并对新的配置表进行处理:替换的新的配置表要友好,同时保证替换前后功能不能发生变化. ...

  2. SE16传输配置表数据

    SE16标准工具传输配置表数据 (上面说了配置表,所以并不是所有的表都能SE16传输.) 了解到: 1.如果是可维护的表,SE16,执行 然后:表条目->传输条目.选择请求: 2.对于不可维护的 ...

  3. SQLite Expert 删除表数据并重置自动增长列

    用下面的语句肯定是行不通的,语句不支持 truncate table t_Records 方法:1.删除表数据 2.重置自动增长列 where name='t_Records' /*name :是表名 ...

  4. SQL Server中的Merge关键字 更新表数据

    简介 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小精悍:”根 ...

  5. 在GridControl表格控件中实现多层级主从表数据的展示

    在一些应用场景中,我们需要实现多层级的数据表格显示,如常规的二级主从表数据展示,甚至也有多个层级展示的需求,那么我们如何通过DevExpress的GridControl控表格件实现这种业务需求呢?本篇 ...

  6. Unity中建立文本保存数据

    public void CreateYunYD() { GameToolsManager.Instance.effectType = EFFECTTYPE.YunYD; CreateYunOrWu(& ...

  7. sqlite学习笔记8:C语言中使用sqlite之创建表

    前面已经说了怎样打开和关闭数据库,这次要说得是怎样运行SQL语句,来创建一张表. 要用的的函数: sqlite3_exec(sqlite3* db, const char *sql, sqlite_c ...

  8. unity中Android环境变量配置

    http://www.cnblogs.com/windytrees/p/7533477.html

  9. Django中ORM简介与单表数据操作

    一. ORM简介  概念:.ORM框架是用于实现面向对象编程语言种不同类型系统的数据之间的转换 构建模型的步骤:重点 (1).配置目标数据库信息,在seting.py中设置数据库信息 DATABASE ...

  10. SQLite 如何清空表数据并将递增量归零

    SQLite并不支持TRUNCATE TABLE语句 方式一: DELETE FROM [Tab_User] --不能将递增数归零 方式二: DELETE FROM sqlite_sequence W ...

随机推荐

  1. 火山引擎 DataLeap:3 小时分享,体系化讲透企业数据治理如何做?

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 数据治理伴随着数据全生命周期的进程,涉及事前规范检查.事中监控管理.事后优化复盘等过程,关键重点领域包括数据质量的 ...

  2. 人人都会Kubernetes(一):告别手写K8s yaml,运维效率提升500%

    1. Kubernetes的普及和重要性 随着云计算的迅速发展,容器化技术已成为构建和运行分布式应用程序的关键.而Kubernetes作为容器编排领域的佼佼者,已经成为了云原生应用的标准.它不仅简化了 ...

  3. OS | 透过 inode 来理解硬链接和软链接

    什么是inode? 每个文件都对应一个唯一的inode,inode用来存储文件的元信息,包括: 对应的文件 文件字节数 文件数据块的位置 文件的inode号码 文件的硬链接数 文件的读写权限 文件的时 ...

  4. Seata是什么?一文了解其实现原理

    一.背景 随着业务发展,单体系统逐渐无法满足业务的需求,分布式架构逐渐成为大型互联网平台首选.伴随而来的问题是,本地事务方案已经无法满足,分布式事务相关规范和框架应运而生. 在这种情况下,大型厂商根据 ...

  5. ElementUI - <el-table> 表格 selection 设置的复选框禁止选中某些行

    https://blog.csdn.net/weixin_44198965/article/details/119026054

  6. asp.net 程序员常用工具

    1  写作工具: Typora 2. 远程工具 ToDesk 3. 思维整理工具 XimindZen 4. 数据库客户端工具 Navicat Premium 15 5. 录音工具 楼月免费MP3录音软 ...

  7. Mysql 查询优化及索引优化总结

    本文为博主原创,转载请注明出处: 一.Mysql 索引的优缺点: 优点:加快数据的检索速度,这是应用索引的主要用途: 使用唯一索引可以保证数据的唯一性 缺点: 索引也需要占用物理空间,并不是索引越多越 ...

  8. 调整PR界面字体大小

    1.问题 界面字体太大或者太小,看得不舒服 2.解决问题 按住ctrl+F12,调出如下工作台 选择Debug Datatbase View 其中找到AdobeCleanFontSize,并修改 重启 ...

  9. 【Linux】字符驱动之sysfs接口实现

    [来源]https://blog.csdn.net/qq_20553613/article/details/104556269

  10. JMS微服务开发示例(三)使用分布式锁和编写定时任务

    分布式锁 在Controller当中,提供了分布式锁的功能,代码如下: class HelloworldController : MicroServiceControllerBase { static ...