sqlite3 数据库

数据库创建

--------------------------------------------
-- 数据库sqlite3
sqliet3 = require("lsqlite3")

sqlite3db = nil

------------------------
-- 重载assert函数
local assert_,assert = assert,function(test)
	if not test then
		error(sqlite3db:errmsg(),2)
	end
end

DBFileName = cc.FileUtils:getInstance():getWritablePath()
DBFileName = DBFileName .. "/test.db"
DBManager = {}

-- 暂停定时保存数据库
function DBManager.pauseSaveDB()
	if DBManager.scheduleSaveDB then
		local scheduler = cc.Director:getInstance():getScheduler()
		scheduler:unscheduleScriptEntry(DBManager.scheduleSaveDB)
		DBManager.scheduleSaveDB = nil
	end
end

-- 定时保存数据库
function DBManager.resumeSaveDB()
	if not DBManager.scheduleSaveDB then
		local scheduler = cc.Director:getInstance():getScheduler()
		DBManager.scheduleSaveDB = scheduler:scheduleScriptFunc(DBManager.saveDB,5,false)
	end
end

-- 保存数据库
function DBManager.saveDB()
	sqlite3db:loadOrSaveDb(DBFileName,1)
end

-- 打开数据库 
function DBManager.openDB()
	local db = sqliet3:open_memory()
	-- 定时保存数据库
	DBManager.resumeSaveDB()
	return db
end

---------------------------------------------------------------------------
-- 关闭数据库
function DBManager.closeDB()
	assert(sqlite3db:close() == sqlite3.OK)
end

-- 删除表数据
function DBManager.deleteTable()
	local tableName = { "player", "level"}
	for name, tables, in pairs(tableName) do 
		local sqlStr = string.format("delete from '%s'",tables)
		assert(sqlite3db:exec(sqlStr) == sqlite3.OK)
	end 
end

local retrieveTableColums = function()
	LevelTable.retriveColum()
end

-- 创建表
function DBManager.createList()
	local sqlStr = [[
	create table if not exists player(
	player_id    integer    not null,
	roleid      char(60),
	primary key (player_id)
	);

	create table if not exists level(
	player_id 		integer  		not null,
	level_name		char(60),
	foreign key (player_id) references player (player_id)
	);
	create index if not exists relationship_test1_fk on bloodpoint (
	player_id asc
	);
	]]
	assert(sqlite3db:exec(sqlStr) == sqliet3.OK)

	-- 恢复数据库列表
	retrieveTableColums()
end

-- 创建数据库
function DBManager.createDB()
	
	-- 创建前,保证移除旧的数据库
	os.remove(DBFileName)
 	-- 打开数据库链接,相当于新建数据库
 	sqlite3db = DBManager.openDB()
 	-- 创建数据库表
 	DBManager.createList()
 	-- 保存数据库
 	DBManager.saveDB()
end

-- 初始化数据库
function DBManager.initDB()
	sqlite3db:exec("begin transaction")
	------------------------
	-- 初始化
	--
	------------------------

	sqlite3db:exec("commit transaction")
	sqlite3db:exec("end transaction")
end

----------------------
-- 启用数据库
function DBManager.setDBDate()
	local isExist = cc.FileUtils:getInstance():isFileExist(DBFileName)
	if not isExist then

		DBManager.createDB()
		DBManager.initDB()
		DBManager.saveDB()
	else
		sqlite3db = DBManager.openDB()
		sqlite3db:loadOrSaveDb(DBFileName,0)
		DBManager.createList()
	end
end

function main()
	DBManager.setDBDate()
end


表操作

-----------------------------------------------------------------------
-- 表操作
LevelTable = { name = "level" }

-- 恢复表列字段
function LevelTable.retriveColum()
	local str = [[select sql from sqlite_master where type = 'table' and name = '%s']]
	local sql = string.format(str, LevelTable.name)
	assert(sqlite3db:exec(sql) == sqlite3.OK)
	local curTableSql = ""
	for a in sqlite3db:nrows(sql) do
		curTableSql = a['sql']
		break
	end
	local colums = {
		player_id = "integer", 
		level_name = "char(60)",
		last_update = "data",			-- 本地时间
	}
	for columName,columType in pairs(colums) do
		if string.find(curTableSql,columName) == nil then
			local str = "ALTER TABLE '%s' ADD '%s' '%s'"
			local sql = string.format(str,LevelTable.name,columName,columType)
			assert(sqlite3db:exec(sql) == sqlite3.OK)
		end
	end
end

-- 插入
function LevelTable.insertRecord(levelid,playerid)
	-- 当前时间 datetime(CURRENT_TIMESTAMP, 'localtime')
	local str = [[insert into level (player_id,level_name,last_update) 
	values('%d','%s',datetime(CURRENT_TIMESTAMP, 'localtime'))]]
	local sql = string.format(str,playerid,levelid)
	assert(sqlite3db:exec(sql) == sqlite3.OK)
end

-- 查询
function LevelTable.selectRecord(playerid)
	local str = [[select level_name from level where player_id = %d]]
	local sql = string.format(str,playerid)
	assert(sqlite3db:exec() == sqlite3.OK)
	for a in sqlite3db:nrows(sql) do
		return a.level_name
	end
end

-- 更新
function LevelTable.updateRecord(levelid,playerid)
	local str = [[update level set level_name = '%s',last_update = datetime(CURRENT_TIMESTAMP, 'localtime') 
	where player_id = %d]]
	local sql = string.format(str,levelid,playerid)
	assert(sqlite3db:exec(sql) == sqlite3.OK)
end

-- 清空数据
function LevelTable.deleteRecord()
	local sql = string.format("delete from level")
	assert(sqlite3db:exec(sql) == sqlite3.OK)
end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值