• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

Lua脚本编写一个简单日历记事本

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

使用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= 
                       
                    
                    

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
华为云GuassDB(forRedis)发布全新版本推出:Lua脚本和SSL连接加密发布时间:2022-07-22
下一篇:
nginxlua处理图片发布时间:2022-07-22
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap