使用lua脚本函数在手机上编写一个日历形式的记事本,涉及到一些常用的lua函数的使用,使用sqlite数据库进行本地数据保存。
使用app:
1.代码手册(帮我查询一些函数的使用,知识点很全面)
2.Mlua(lua解析器,在上面完成代码编写和运行打包)
由于新手上路,所有代码都在一个页面完成,有点混乱
require "import" import "android.app.*" import "android.os.*" import "android.widget.*" import "android.view.*" import \'android.graphics.*\' import \'android.graphics.RectF\' import \'android.graphics.Paint\' import \'android.graphics.drawable.shapes.RoundRectShape\' import \'android.graphics.drawable.ShapeDrawable\' --[[==============;;;=数据库操作==;;=============]] --导入包 import "android.database.sqlite.*" dts={}--记事数据 --字符串替换 function str(s) --s=string.gsub(s,"/","//") s=string.gsub(s,"\'","\'\'") --s=string.gsub(s,"&","/&") --s=string.gsub(s,"_","/_") return s end tbname="tb_note"--表名 dbname="notes.db" dbpath=this.getLuaDir().."/"..dbname--存放路径 --打开数据库(没有自动创建) db = SQLiteDatabase.openOrCreateDatabase(dbpath,MODE_PRIVATE, nil); --execSQL()方法可以执行insert、delete、update和CREATE TABLE之类有更改行为的SQL语句 function exec(sql) db.execSQL(sql); end --rawQuery()方法用于执行select语句。 function raw(sql,text) cursor=db.rawQuery(sql,text) end --创建数据库表 function createdbtable() --查询表是否存在 local sql="select count(*) from sqlite_master where type=\'table\' and name = \'"..tbname.."\'" if pcall(raw,sql,nil) then cursor.moveToNext() local nn=cursor.getInt(0) if nn < 1 then sql="create table "..tbname.."(id integer primary key,t_data text,t_date smalldatetime)" if pcall(exec,sql) then return 1--创建成功 else return 0--创建失败 end else return -1--表已存在 end end end --添加数据 function adddata(da,de) if pcall(exec,"insert into "..tbname.." (t_data,t_date) values(\'"..str(da).."\',\'"..de.."\')") then return true--添加成功 else return false--添加失败 end end --删除数据 function deldata(d) if pcall(exec,"delete from "..tbname.." where id="..d) then return true--成功 else return false--失败 end end --更新数据 function updata(da,d) --根据id更新数据,不更新创建时间 if pcall(exec,"update "..tbname.." set t_data=\'"..str(da).."\' where id="..d) then return true--成功 else return false--失败 end end --查询数库 function seldata(sql) dts={} if pcall(raw,sql,nil) then while (cursor.moveToNext()) do local tid = cursor.getInt(0); local tda = cursor.getString(1); local tde = cursor.getString(2); table.insert(dts,{id=tid,date=tde,data=tda}); end cursor.close() else --print("查询失败") end end --查询所有 function selall() seldata("select * from "..tbname) end --[[==============;;;=数据库操作==;;=============]] colorlist={0xffFFEBEE,0xFfEDE7F6,0xFfE1F5FE,0xffE8F5E9,0xffFFFDE7,0xffFBE9E7,0xffECEFF1,0xffF3E5F5,0xffE3F2FD,0xffE0F2F1,0xffF9FBE7,0xffFFF3E0,0xffFCE4EC} function gettitle(n) if n==1 then return "日" end if n==2 then return "一" end if n==3 then return "二" end if n==4 then return "三" end if n==5 then return "四" end if n==6 then return "五" end if n==7 then return "六" end return "" end function kong(t) local t3={ LinearLayout; Orientation=\'vertical\'; layout_width=wd..\'px\'; { TextView; layout_width=\'fill\'; layout_height=\'38dp\'; Gravity=\'center\'; textColor=\'#000000\'; text=""; textSize=\'18sp\'; background=\'#F5F5F5\'; --background=\'#EEEEEE\'; --[[ BackgroundDrawable=LuaDrawable(function(canvas,paint,draw) paint.setColor(0xff000000) paint.setStyle(Paint.Style.STROKE) paint.setStrokeWidth(2) canvas.drawRoundRect(RectF(draw.getBounds()),0,0,paint) end); ]] }; } table.insert(t,t3) end --设置每格的宽度,根据屏幕宽度 wd=(activity.getWidth()-20)/7 --自定义字符串分隔符获取数组 function string.split(input, delimiter) input = tostring(input) delimiter = tostring(delimiter) if (delimiter==\'\') then return false end local pos,arr = 0, {} -- for each divider found for st,sp in function() return string.find(input, delimiter, pos, true) end do table.insert(arr, string.sub(input, pos, st - 1)) pos = sp + 1 end table.insert(arr, string.sub(input, pos)) return arr end --获取年,月,第一天是周几 function a1(y,m) local dt=os.date("*t",os.time({year=y,month=m,day="1"})) return (dt["wday"]-1) end --获取年,月有多少天 function a2(y,m) local ml=os.difftime(os.time({year=a3(y,m)["year"],month=a3(y,m)["month"],day="1"}),os.time({year=y,month=m,day="1"})) ml=ml/60/60/24 return math.floor(ml) end --获取年,月上一月份 function a4(y,m) local o=os.time({year=y,month=m,day="1"})-(60*60*24*28) local cd=os.date("*t",o) return {year=cd["year"],month=cd["month"]} end --获取年,月下一月份 function a3(y,m) local o=os.time({year=y,month=m,day="1"})+(60*60*24*31) local cd=os.date("*t",o) return {year=cd["year"],month=cd["month"]} end --把时间字符串转换为时间 function gtd(s) local ss=string.split(s,"-") return os.date("*t",os.time({year=ss[1],month=ss[2],day=ss[3]})) end --截取字符串,返回少量字符串,其他显示... function subs(s,n)--字符串,显示多少个字符 if string.len(s) > n then s=string.gsub(s,"\n","") s=string.gsub(s," ","") return string.sub(s,1,n).."..." else return s end end --------- --查询每月的数据 function selmonth(y,m)--年,月 local dd=a2(y,m)--本月有多少天 local fd=y.."-"..m.."-01"--第一天 local ld=y.."-"..m.."-"..dd--最后一天 --时间必须是0000-00-00格式的 fd=os.date("%Y-%m-%d",os.time(gtd(fd))) ld=os.date("%Y-%m-%d",os.time(gtd(ld))) local sql="select * from "..tbname.." where t_date>=\'"..fd.."\' and t_date<=\'"..ld.."\'" seldata(sql) end --查询每一天的数据 function selday(y,m,d)--年,月,日 d=y.."-"..m.."-"..d d=os.date("%Y-%m-%d",os.time(gtd(d))) local sql="select * from "..tbname.." where t_date=\'"..d.."\'" seldata(sql) end --selmonth("2020","03") --selday("2020","3","24") lo=nil--选择上一个日期 bcc1,bcc2,bcc3,bcc4="#FFFDE7","#FFF59D","#FFCDD2","#F44336"--代表平常,今天,有记事,选择后背景色 cdt=os.date("*t",os.time()) cyear=cdt["year"] cmonth=cdt["month"] w=a1(cyear,cmonth)--周几 z,n=a2(cyear,cmonth),7--有31天,7天一周 m=math.ceil((z+w)/n) cyear,cmonth,cday="","",""--当前年月日 --获取背景色,根据不同的情况获取背景色 function getbkc() --判断今天 local sy=os.date("*t",os.time()) if cyear==sy["year"] and cmonth==sy["month"] and cday==sy["day"] then return bcc2 end----- --判断是否有记事记录 if dts~=nil then for i,v in pairs(dts) do local sy=gtd(v["date"]) if cyear==sy["year"] and cmonth==sy["month"] and cday==sy["day"] then return bcc3 end end end return bcc1 end --显示今天 function jt() local dt=os.date("*t",os.time()) cyear=dt["year"] cmonth=dt["month"] w=a1(cyear,cmonth) z=a2(cyear,cmonth) m=math.ceil((z+w)/n) --selmonth(cyear,cmonth)--查询当月数据 --selday(cyear,cmonth,dt["day"])--查询今天的数据 rili()--更新数据 end --显示上一月 function st() local sy=a4(cyear,cmonth) cyear=sy["year"] cmonth=sy["month"] w=a1(cyear,cmonth) z=a2(cyear,cmonth) m=math.ceil((z+w)/n) --selmonth(cyear,cmonth)--查询当月数据 rili() end --显示下一月 function xt() local sy=a3(cyear,cmonth) cyear=sy["year"] cmonth=sy["month"] w=a1(cyear,cmonth) z=a2(cyear,cmonth) m=math.ceil((z+w)/n) --selmonth(cyear,cmonth)--查询当月数据 rili() end --[[========================= 日历页面 ]] function rili() selmonth(cyear,cmonth)--查询当月数据 t={LinearLayout; orientation="vertical"; layout_width=\'100%w\'; padding="10px"; } --表头 local t1={ LinearLayout; Orientation=\'horizontal\'; layout_width=\'100%w\'; layout_marginTop="8dp"; } for j=1,n do local txt=gettitle(j) local t2={ LinearLayout; Orientation=\'horizontal\'; layout_width=wd..\'px\'; background=\'#42A5F5\'; { TextView; layout_width=\'fill\'; layout_height=\'48dp\'; Gravity=\'center\'; textColor=\'#ffffff\'; text=txt; textSize=\'18sp\'; }; }; table.insert(t1,t2) end table.insert(t,t1) --表体 for i=1,m do local t1={ LinearLayout; Orientation=\'horizontal\'; layout_width=\'fill\'; } for j=1,n do local tmp=n*i+j-n-w cday=tmp--当前日期赋值 if tmp > z then kong(t1) continue --break end if i==1 and j <= w then kong(t1) continue end local t2={ LinearLayout; Orientation=\'vertical\'; layout_width=wd..\'px\'; background=getbkc();--动态获取背景色 { TextView; layout_width=\'fill\'; layout_height=\'38dp\'; Gravity=\'center\'; textColor=\'#000000\'; text=tmp..""; textSize=\'18sp\'; onClick=function(o) --实现让点击日期时,当前日期变色,上一个日期恢复颜色 if lo ~= nil then lo.setTextColor(Color.parseColor(\'#000000\')) end o.setTextColor(Color.parseColor(bcc4)) lo=o--赋值给上一个控件 cday=tmp--当前选择日期赋值 --更新数据 --selday(cyear,cmonth,o.text) --rili() end; }; }; table.insert(t1,t2) end table.insert(t,t1) end local t2={ LinearLayout; Orientation=\'horizontal\'; layout_width="fill"; background=\'#EEEEEE\'; padding="10px"; { TextView; layout_width=\'33%w\'; layout_height=\'38dp\'; Gravity=\'left\'; textColor=\'#FF9800\'; text="上一月"; textSize=\'16sp\'; onClick=function() st() --rili() end; }; { TextView; layout_width=\'33%w\'; layout_height=\'38dp\'; Gravity=\'center\'; textColor=\'#2196F3\'; text=cyear.."-"..cmonth.." [今]"; textSize=\'16sp\'; onClick=function() jt() --rili() end; }; { TextView; layout_width=\'30%w\'; layout_height=\'38dp\'; Gravity=\'right\'; textColor=\'#FF9800\'; text="下一月"; textSize=\'16sp\'; onClick=
全部评论
请发表评论