测试程序下载:http://pan.baidu.com/s/1dERKj2Dsql
APP数据来源大体分三种:
一、线上数据
服务器端返回的数据,通常采用用HTTP或者HTTPS、SOCKET链接方式与APP客户交互,能够返回json格式或者二进制。 数据库
local json = luaopen_cjson(); function HelperURLResponeFunc(urlresponse) local urlrequest = urlresponse:getRequest(); if(urlrequest.thread ~= nil) then --LXZMessageBox("urlrequest.thread:"..type(urlrequest.thread)); coroutine.resume(urlrequest.thread, urlresponse); end end local service_host = "http://120.55.84.103:8080/";--服务器地址 local function HelperPostGetJSON(url, data, fn) local co = coroutine.create(function (thread) local urlrequest = _urlRequest:new(); urlrequest.nRequestType = eRequestPost; urlrequest.func = "HelperURLResponeFunc"; urlrequest.url = url.."?"; for k,v in pairs(data) do urlrequest.url = urlrequest.url ..k.."="..v.."&"; end urlrequest.url = TrimRightChar(urlrequest.url, '&'); urlrequest.url = TrimRightChar(urlrequest.url, '?'); urlrequest.thread = thread; --LXZMessageBox(urlrequest.url); local curl = CLXZCurl:Instance(); curl:send(urlrequest); local urlresponse = coroutine.yield(); if(fn~=nil) then fn(urlresponse); end end); coroutine.resume(co, co); end --从服务器获取数据 local function OnServer(window, msg, sender) local root=HelperGetRoot();--得到根节点 local wnd=root:GetLXZWindow("id");--得到id窗口 --建立协程,在协程里能够顺序执行异步代码 HelperCoroutine(function(thread) HelperPostGetJSON(service_host.."getid", {}, function(urlresponse)--异步调用接口 LXZMessageBox("urlresponse:getResponseData:"..urlresponse:getResponseData()) local res = json.decode(urlresponse:getResponseData()); if res then HelperSetWindowText(wnd, res.id); else HelperSetWindowText(wnd, "从服务器获取失败"); end coroutine.resume(thread); end); coroutine.yield(); end); end
二、本地配置数据
可读取key-value模式文本数据文件json
--从配置文件读取数据 local function OnCfg(window, msg, sender) local root=HelperGetRoot();--得到根节点 local wnd=root:GetLXZWindow("id");--得到id窗口 local cfg = ILXZCoreCfg:new_local(); cfg:load(LXZAPIGetWritePath().."data.cfg"); local id = cfg:GetInt("id"); if id then HelperSetWindowText(wnd, id); else HelperSetWindowText(wnd, "配置文件错误"); end end
三、sqlite3数据库
集成有sqlite数据库,可直接跟sqlite交互。服务器
--数据库相关 local function DBInitialize(dbname) LXZDoFile("sqlite3.lua"); --数据库模块 local corecfg = ICGuiGetLXZCoreCfg(); local dbfullpath = ""; if(corecfg.IsEditTool==true) then --若是是lae工具中. dbfullpath = LXZAPIGetWritePath().."Edit"..dbname; --防止产生数据库同名时没法同时打开。 else dbfullpath = LXZAPIGetWritePath()..dbname; end --打开sqlite3 local db = sqlite3.open(dbfullpath); db:exec("drop table Test"); --删除存在的表 sql = "create table Test(id INTEGER PRIMARY KEY autoincrement, name VARCHAR(32), userid INTERGER)"; local d,err = db:exec(sql); --建立Test表,id做为主键,自动增长,name名字可变长. sql = "insert into Test(id,name,userid) values(100, \"我是个测试名字!\", 1111111)" --插入测试数据. local d,err = db:exec(sql); return db; end --文件加载时初始化. local db=DBInitialize("TestData.db"); --从数据库读取数据 local function OnSqlite(window, msg, sender) local root=HelperGetRoot();--得到根节点 local wnd=root:GetLXZWindow("id");--得到id窗口 local sql="select * from Test where id=100"; local d,err = db:exec(sql); local users = HelperDBSelect(db, sql, true); if users and users[1] then HelperSetWindowText(wnd, users[1].userid); else HelperSetWindowText(wnd, "该数据不存在."); end end
一、测试程序界面curl
测试代码:异步
LXZDoFile("LXZHelper.lua"); LXZDoFile("serial.lua"); local json = luaopen_cjson(); function HelperURLResponeFunc(urlresponse) local urlrequest = urlresponse:getRequest(); if(urlrequest.thread ~= nil) then --LXZMessageBox("urlrequest.thread:"..type(urlrequest.thread)); coroutine.resume(urlrequest.thread, urlresponse); end end local service_host = "http://120.55.84.103:8080/";--服务器地址 local function HelperPostGetJSON(url, data, fn) local co = coroutine.create(function (thread) local urlrequest = _urlRequest:new(); urlrequest.nRequestType = eRequestPost; urlrequest.func = "HelperURLResponeFunc"; urlrequest.url = url.."?"; for k,v in pairs(data) do urlrequest.url = urlrequest.url ..k.."="..v.."&"; end urlrequest.url = TrimRightChar(urlrequest.url, '&'); urlrequest.url = TrimRightChar(urlrequest.url, '?'); urlrequest.thread = thread; --LXZMessageBox(urlrequest.url); local curl = CLXZCurl:Instance(); curl:send(urlrequest); local urlresponse = coroutine.yield(); if(fn~=nil) then fn(urlresponse); end end); coroutine.resume(co, co); end --从服务器获取数据 local function OnServer(window, msg, sender) local root=HelperGetRoot();--得到根节点 local wnd=root:GetLXZWindow("id");--得到id窗口 --建立协程,在协程里能够顺序执行异步代码 HelperCoroutine(function(thread) HelperPostGetJSON(service_host.."getid", {}, function(urlresponse)--异步调用接口 LXZMessageBox("urlresponse:getResponseData:"..urlresponse:getResponseData()) local res = json.decode(urlresponse:getResponseData()); if res then HelperSetWindowText(wnd, res.id); else HelperSetWindowText(wnd, "从服务器获取失败"); end coroutine.resume(thread); end); coroutine.yield(); end); end --数据库相关 local function DBInitialize(dbname) LXZDoFile("sqlite3.lua"); --数据库模块 local corecfg = ICGuiGetLXZCoreCfg(); local dbfullpath = ""; if(corecfg.IsEditTool==true) then --若是是lae工具中. dbfullpath = LXZAPIGetWritePath().."Edit"..dbname; --防止产生数据库同名时没法同时打开。 else dbfullpath = LXZAPIGetWritePath()..dbname; end --打开sqlite3 local db = sqlite3.open(dbfullpath); db:exec("drop table Test"); --删除存在的表 sql = "create table Test(id INTEGER PRIMARY KEY autoincrement, name VARCHAR(32), userid INTERGER)"; local d,err = db:exec(sql); --建立Test表,id做为主键,自动增长,name名字可变长. sql = "insert into Test(id,name,userid) values(100, \"我是个测试名字!\", 1111111)" --插入测试数据. local d,err = db:exec(sql); return db; end --文件加载时初始化. local db=DBInitialize("TestData.db"); --从数据库读取数据 local function OnSqlite(window, msg, sender) local root=HelperGetRoot();--得到根节点 local wnd=root:GetLXZWindow("id");--得到id窗口 local sql="select * from Test where id=100"; local d,err = db:exec(sql); local users = HelperDBSelect(db, sql, true); if users and users[1] then HelperSetWindowText(wnd, users[1].userid); else HelperSetWindowText(wnd, "该数据不存在."); end end --从配置文件读取数据 local function OnCfg(window, msg, sender) local root=HelperGetRoot();--得到根节点 local wnd=root:GetLXZWindow("id");--得到id窗口 local cfg = ILXZCoreCfg:new_local(); cfg:load(LXZAPIGetWritePath().."data.cfg"); local id = cfg:GetInt("id"); if id then HelperSetWindowText(wnd, id); else HelperSetWindowText(wnd, "配置文件错误"); end end --事件绑定 local event_callback = {} event_callback.__index = event_callback; event_callback ["OnServer"] = OnServer; event_callback ["OnSqlite"] = OnSqlite; event_callback ["OnCfg"] = OnCfg; --消息派发接口 function main_dispacher(window, cmd, msg, sender) LXZAPI_OutputDebugStr("cmd 1:"..cmd); if(event_callback[cmd] ~= nil) then --若是已经绑定 LXZAPI_OutputDebugStr("cmd 2:"..cmd); event_callback[cmd](window, msg, sender);--则调用绑定的接口 end end