在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遊戲項目的經驗,最常修改的部分有:

  1. 語言包
  2. 任務表
  3. 道具表(裝備,物品等等這些)
  4. 新手引導
  5. 自寶義配置表(key/value形式的表)
  6. 活動表(充值/節日/節日活動表,部分數據放配置,部分配置協議下發)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章