Lua版本Sqlite文档:http://lua.sqlite.org/index.cgi/doc/tip/doc/lsqlite3.wikihtml
sqlite官网:https://www.sqlite.org/index.htmlsql
提升游戏的启动速度,在游戏启动时,不须要去加载配置文件,而是在用到时,从sqlite中读取,大大提升启动速度。api
咱们是把sqlite编译进xlua的lib(.so)在lua中调用,没有经过mono提供的sqlite接口访问
个人运行环境以下(说明:文章写于2017年6月1日,在草稿箱一直未发布)app
XLua: v2.1.6ide
Unity :5.3.7性能
luasqlite版本:sqlite 3ui
表的建立,添加数据,查询lua
--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.htmlcode
若是使用sqlite的语法,在lua版本中是无效的。sqlite
解决办法:使用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中并不能彻底使用
直接在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'
查看文档:http://lua.sqlite.org/index.cgi/doc/tip/doc/lsqlite3.wiki#db_close
使用db:close和db:close_vm() 都没法彻底关闭db的链接
编辑db文件,提示database被锁定
解决办法:经过在Unity的C#层进行Close
经实测在移动设备或模拟器上执行Update/Create Table等SQL语句,性能很是差,执行一次热更新SQL约须要15s而直接下载并替换db则会快不少,因此我推荐直接替换db文件。
由于当有数据更新时是替换db,建议把常常修改的配置表放在一个db中,不常修改的放另外一个db,也就是把数据存在多个db中。
根据我从业三个rpg游戏项目的经验,最常修改的部分有: