使用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=function()
        xt()
        --rili()
      end;

    };
  };
  local t3={
    ListView;--列表视图
    layout_width='fill';
    layout_height='fill';
    DividerHeight='1';--设置分隔线宽度,0表示无分隔
    id="rllist";
  };
  table.insert(t,t2)
  table.insert(t,t3)
  --print("test")
  activity.setContentView(loadlayout(t))

  local rlitem={
    LinearLayout,
    orientation="horizontal",
    layout_width="fill",
    {
      TextView,
      id="rlitemTXT",
      layout_margin="15dp",
      layout_width="80%w"
    },
    {
      TextView,
      id="delTXT",
      layout_margin="15dp",
      layout_width="20%w",
      TextColor="#F44336";
      layout_height='fill';
      text="删除",
    },
  }

  local dtt={}
  --创建适配器,将数据表和自定义视图添加进适配器
  adpp=LuaAdapter(activity,dtt,rlitem)--dts是数据
  for i,v in pairs(dts) do--把dts数据集合中的数据添加到list数据组中
    table.insert(dtt,{
      rlitemTXT={
        Text=v["date"].."\t\t"..subs(v["data"],38),
        Tag=v["id"];
        onClick=function(o)
          --print(o.Tag)
          addbiji(o.Tag)
        end;
      },
      delTXT={
        --Text=v["date"].."\t\t"..subs(v["data"],38);
        Tag=v["id"];
        onClick=function(o)
          AlertDialog.Builder(this)
          .setTitle("删除提示")
          .setMessage("你是否要删除这条笔记?")
          .setPositiveButton("删除",{
            onClick=function(v)
              --print("删除"..o.Tag)
              deldata(o.Tag)
              rili()
            end
          })
          --.setNeutralButton("中立",nil)
          .setNegativeButton("点错了",nil)
          .show()
        end;
      },
    })
  end
  --为list设置适配器
  rllist.Adapter=adpp
end

editxt=""
ediid=0
ccpage=nil--当前页面
--添加笔记
function addbiji(idd)--id,如果为0则添加
  -- print(idd)
  idd=tonumber(idd)

  if idd<=0 then--添加
    editxt=""
    ediid=0
   else--修改
    for i,v in pairs(dts) do
      if v["id"]==idd then
        editxt=v["data"]
        ediid=idd
        break
      end
    end
  end

  adp={
    LinearLayout;
    orientation="vertical";
    layout_width='100%w';
    padding="10px";
    {
      LinearLayout;
      orientation="horizontal";
      Gravity='right';
      layout_width='100%w';
      padding="10px";
      {
        Button;
        layout_marginBottom="16dp";
        layout_width="50dp";
        layout_height="38dp";
        text="取消";
        id="addbnt";
        textSize="12dp";
        layout_marginLeft="16dp";
        layout_marginRight="16dp";
        background="#009688";
        textColor="#ffffff";
        onClick=ccpage;--当前访问的页面初始化方法
      };
      {
        Button;
        layout_marginBottom="16dp";
        layout_width="50dp";
        layout_height="38dp";
        text="保存";
        id="quxiaobnt";
        textSize="12dp";
        layout_marginLeft="16dp";
        layout_marginRight="16dp";
        background="#009688";
        textColor="#ffffff";
        onClick=function()
          local str=edit.text
          if tostring(ediid)=="0" then--添加
            if str ~= "" then
              adddata(str,os.date("%Y-%m-%d",os.time()))
            end
           else--修改
            updata(str,ediid)
          end
          ccpage()--更新加载页面
        end;
      };
    };
    {
      EditText;
      layout_width="95%w";
      id="edit";
      background="#FFFDE7";
      textSize="14dp";
      layout_marginTop="6dp";
      layout_marginLeft="16dp";
      layout_marginRight="16dp";
      inputType="textMultiLine";
      textScaleX="1";
      hint="在这里开始记录你的笔记吧~";
      Tag=ediid;
      text=editxt;
    };
  }
  activity.setContentView(loadlayout(adp))
end
-------聊天界面
function dymoli(s)
  local yy={
    {"[date]",os.date("%Y-%m-%d %H:%M:%S",os.time())},
    {"[cqname]","小茉莉"},
    {"[father]","屏幕"},
    {"[mother]","屏幕"},
    {"[name]","主人"},
    {"[height]","168cm"},
    {"[weight]","48kg"},
    {"[sex]","mm"},
    {"[zodiac]","双鱼座"},
    {"[blood]","O型"},
    {"[school]","清华大学"},
    {"[city1]","江苏省"},
    {"[city1]","苏州市"},
  }
  for i,v in pairs(yy) do
    s=string.gsub(s,"%"..v[1],v[2])
  end
  return s
end
function xy(a,b,c,d)
  if tostring(a)=="200" then
    --print(b)
    vsedit.text=vsedit.text.."\r\n小茉莉: "..dymoli(b).."\r\n"
    scrview.fullScroll(View.FOCUS_DOWN);
  end

end
function char()
  local adp={
    LinearLayout;
    orientation="vertical";
    layout_width='100%w';
    padding="10px";

    {
      LinearLayout;
      orientation="horizontal";--horizontal
      --Gravity='right';
      layout_width='100%w';
      padding="10px";
      layout_marginTop="16dp";
      layout_marginLeft="16dp";
      layout_marginRight="16dp";
      layout_marginBottom="16dp";
      {
        Button;
        --layout_marginBottom="16dp";
        layout_width="13%w";
        layout_marginRight="16dp";
        layout_height="36dp";
        text="返回";
        textSize="12dp";
        background="#009688";
        textColor="#ffffff";
        onClick=function()
          selall()
          tt11()
        end;
      };
      {
        EditText;
        layout_width="55%w";
        id="esedit";
        background="#FFFDE7";
        textSize="14dp";
        textScaleX="1";
        text="";
      };
      {
        Button;
        --layout_marginBottom="16dp";
        layout_width="13%w";
        layout_marginLeft="16dp";
        layout_height="36dp";
        text="发送";
        id="squxiaobnt";
        textSize="12dp";
        --layout_marginLeft="1dp";
        --layout_marginRight="16dp";
        background="#009688";
        textColor="#ffffff";
        onClick=function()
          local str=esedit.text
          if str~="" and string.len(str)>0 then
            vsedit.text=vsedit.text.."\r\n我: "..str.."\r\n"
            esedit.text=""
            Http.get("http://i.itpk.cn/api.php?question="..str,xy)
          end
        end;
      };
    };
    {
      LinearLayout;
      orientation="vertical";--horizontal
      --Gravity='right';
      layout_width='100%w';
      --padding="10dp";
      {
        ScrollView;
        layout_width="90%w";
        layout_height="wrap_content";
        id="scrview";
        {
          TextView;
          id="vsedit";
          textSize="14dp";
          layout_marginTop="6dp";
          layout_marginLeft="16dp";
          layout_marginRight="16dp";
          padding="10dp";
          text="";
        };
      };
    };
  }
  activity.setContentView(loadlayout(adp))
end

-------搜索界面
issearch=false
function searchpage()
  local adp={
    LinearLayout;
    orientation="vertical";
    layout_width='100%w';
    padding="10px";
    {
      LinearLayout;
      orientation="horizontal";--horizontal
      --Gravity='right';
      layout_width='100%w';
      padding="10px";
      {
        EditText;
        layout_width="70%w";
        id="sedit";
        background="#FFFDE7";
        textSize="14dp";
        layout_marginTop="6dp";
        layout_marginLeft="16dp";
        layout_marginRight="16dp";
        inputType="textMultiLine";
        textScaleX="1";
        hint="搜索~";
        Tag=ediid;
        text="";
      };
      {
        Button;
        --layout_marginBottom="16dp";
        layout_width="60dp";
        layout_marginTop="6dp";
        layout_height="36dp";
        text="搜索";
        id="quxiaobnt";
        textSize="12dp";
        layout_marginLeft="1dp";
        --layout_marginRight="16dp";
        background="#009688";
        textColor="#ffffff";
        onClick=function()
          local str=sedit.text
          if str~="" and string.len(str)>0 then
            local sql="select * from "..tbname.." where t_data like '%"..str.."%'"
            seldata(sql)
            issearch=true
          end
          tt11()
        end;
      };
    };
  }
  activity.setContentView(loadlayout(adp))
end
--[[=========================
加载页面
]]
function tt11()
  if not issearch then
    selall()
  end

  local scale = activity.getResources().getDisplayMetrics().scaledDensity

  local pmk=(activity.getWidth() / scale + 0.5)--屏幕宽
  local pmg=(activity.getHeight() / scale + 0.5)--屏幕高
  local ggg=150
  t11={
    FrameLayout;
    {
      Button,
      id="searchbnt",
      background='#eeeeee';
      --elevation="20dp",
      text="Q";
      layout_width="50dp";
      layout_height="50dp";
      layout_marginTop=(pmg-165-ggg).."dp";
      layout_marginLeft=(pmk-55).."dp";
      TextColor="#ff60c4ba";
      TextSize="30";
      padding="12";
      onClick=function()
        char()
      end;
    };
    {
      Button,
      id="searchbnt",
      background='#eeeeee';
      --elevation="20dp",
      text="?";
      layout_width="50dp";
      layout_height="50dp";
      layout_marginTop=(pmg-110-ggg).."dp";
      layout_marginLeft=(pmk-55).."dp";
      TextColor="#ff60c4ba";
      TextSize="30";
      padding="12";
      onClick=function()
        issearch=false
        searchpage()--char()
      end;
    };
    {
      Button,
      id="fab",
      background='#eeeeee';
      --elevation="20dp",
      text="+";
      layout_width="50dp";
      layout_height="50dp";
      layout_marginTop=(pmg-55-ggg).."dp";
      layout_marginLeft=(pmk-55).."dp";
      TextColor="#ff60c4ba";
      TextSize="30";
      padding="12";
      onClick=function()
        addbiji(0)
      end;
    };
    --------
    --加载数据的列表识图
    --------
    {
      ListView;--列表视图
      layout_width='fill';
      layout_height='fill';
      DividerHeight='0';--设置分隔线宽度,0表示无分隔
      id="dtlist";
    };

  }
  --创建自定义项目视图,也就是一个文字视图。
  item={
    LinearLayout,
    orientation="horizontal",
    layout_width="fill",
    --id="lstitem",
    {
      CardView;--卡片控件
      id="card";--设置id
      layout_margin='8dp';--卡片边距
      layout_gravity='center';--子控件在父布局中的对齐方式
      CardElevation='2dp';--卡片阴影
      layout_width='fill';--卡片宽度
      layout_height='fill';--卡片高度
      radius='8dp';--卡片圆角
      --CardBackgroundColor='#FFDDA767';--
      {
        LinearLayout,
        orientation="horizontal",
        layout_width="fill",
        {
          TextView,
          id="itemTXT",
          layout_margin="15dp",
          layout_width="70%w",
        },
        {
          LinearLayout,
          orientation="horizontal",
          layout_width="20%w",
          gravity='right';
          {
            TextView,
            id="delTXT",
            layout_margin="15dp",
            TextColor="#F44336";
            text="删除",
          },
        },
      },

    },
  }
  activity.setContentView(loadlayout(t11))
  dtt={}
  --创建适配器,将数据表和自定义视图添加进适配器
  adpp=LuaAdapter(activity,dtt,item)--dts是数据
  for i,v in pairs(dts) do--把dts数据集合中的数据添加到list数据组中
    table.insert(dtt,{
      card={
        CardBackgroundColor=colorlist[i%#colorlist], --表里用了取余算法,让颜色实现循环。
      },
      itemTXT={
        --加载,多余的字显示。。。
        Text=v["date"].."\t\t"..subs(v["data"],58);
        Tag=v["id"];
        onClick=function(o)
          addbiji(o.Tag)
        end;
      },
      delTXT={
        Tag=v["id"];
        onClick=function(o)
          AlertDialog.Builder(this)
          .setTitle("删除提示")
          .setMessage("你是否要删除这条笔记?")
          .setPositiveButton("删除",{
            onClick=function(v)
              deldata(o.Tag)--删除操作
              tt11()
            end
          })
          .setNegativeButton("点错了",nil)
          .show()
        end;
      },
    })
  end
  --为list设置适配器
  dtlist.Adapter=adpp
end

function onCreate()
  createdbtable()
  --print("窗口创建")
  jt()
  tt11()
  ccpage=tt11
  --char()
end
--[[其他窗体事件
function main(...)
  --...是newActivity传递过来的参数。
  print("入口函数",...)
end

function onCreate()
  print("窗口创建")
end

function onStart()
  print("活动开始")
end

function onResume()
  print("返回程序")
end

function onPause()
  print("活动暂停")
end

function onStop()
  print("活动停止")
end

function onDestroy()
  print("程序已退出")
end
]]
--activity.setContentView(loadlayout(t))
--ActionBar返回按钮
--activity.ActionBar.setDisplayHomeAsUpEnabled(false)
--自定义返回按钮图标
--activity.ActionBar.setHomeAsUpIndicator(drawable)

import "android.text.SpannableString"
import "android.text.style.ForegroundColorSpan"
import "android.text.Spannable"
--sp = SpannableString("日历")
--sp.setSpan(ForegroundColorSpan(0xff1DA6DD),0,#sp,Spannable.SPAN_EXCLUSIVE_INCLUSIVE)
--activity.ActionBar.setTitle(sp)

--菜单
function onCreateOptionsMenu(menu)
  menu.add("退出")
end
function onOptionsItemSelected(item)
  if item.Title~=nil then
    if item.Title=="退出"
      AlertDialog.Builder(this)
      .setTitle("退出提示")
      .setMessage("你是否要退出?")
      .setPositiveButton("是",{onClick=function(v) os.exit() end})
      .setNegativeButton("否",nil)
      .show()
    end
  end
end

--ActionBar返回按钮
--activity.ActionBar.setDisplayHomeAsUpEnabled(false)
--自定义返回按钮图标
--activity.ActionBar.setHomeAsUpIndicator(drawable)

--Tab导航使用
import "android.app.ActionBar$TabListener"
actionBar=activity.ActionBar
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
tab = actionBar.newTab().setText("笔记").setTabListener(TabListener({
  onTabSelected=function()
    --print"Tab1"
    sp = SpannableString("笔记列表")
    sp.setSpan(ForegroundColorSpan(0xff1DA6DD),0,#sp,Spannable.SPAN_EXCLUSIVE_INCLUSIVE)
    activity.ActionBar.setTitle(sp)
    ccpage=tt11
    tt11()
  end}))
tab2=actionBar.newTab().setText("日历").setTabListener(TabListener({
  onTabSelected=function()
    --print"Tab2"
    sp = SpannableString("日历列表")
    sp.setSpan(ForegroundColorSpan(0xff1DA6DD),0,#sp,Spannable.SPAN_EXCLUSIVE_INCLUSIVE)
    activity.ActionBar.setTitle(sp)
    ccpage=jt
    jt()
  end}))
actionBar.addTab(tab)
actionBar.addTab(tab2)

代码

 在lua中sqlite使用代码

--[[

【常用SQL语句】

1.数据类型:
整型:int
     字符:char(6)
  varchar(24)
文本:text
   布尔:bit
   
日期:smalldatetime

2.删除表:
drop table 表名

3.修改表:
alter table 表名 add 字段 类型
//加约束
alter table 表名 add constraint 约束

4.创建表:
create table 表名(
字段 类型 primary key,
字段 类型 default'值1' check(字段 in('值1','值2'))
)
//多个主键在最后面:
primary key(字段1,字段2)
//参照:
后面加:references 表名(字段)
//条件:
不为空:not null
唯一性:unique
//约束:
check(字段>=值 and 字段<=值)
check(字段 in('值1','值2'))

5.查询语句:
select * from 表名 where 条件语句

6.插入数据:
insert into 表名(字段列表) values(值列表)

7.更新语句:
update 表名 set 字段名 = 值 where 条件

8.删除语句:
delete from 表名 where 条件

9.分页查询:
select * from Account limit 3,5
(获取5条记录,跳过前面3条)

--一一一一一一一一一一一一一一一一一一一一

【常用SQL语句2】

1.子查询:
例:
select 学号,成绩 from xs_kc 
where 课程号=(select 课程号 from kc where 课程名='计算机基础')

2.连接查询:
例:
select 学号,成绩 from xs_kc,kc
where xs_kc.课程号=kc.课程号
add 课程名='计算机基础'

3.创建存储过程:
//根据名字查询平均成绩,输入参数,输出参数
create proc pxs_avgByName(
    @name char(8) ,@avg float output
)
as
    set @avg=(select avg(成绩) 
    from xs,xs_kc 
    where xs.学号=xs_kc.学号 
    and xs.姓名=@name)
go
//执行存储过程
declare @ag float
exec pxs_avgByName '李林',@avg output
select '平均分' =@ag

4.创建触发器:
//如果在XS表中添加或修改的学生学号不是以“08”开头,
//则使用RAISERROR语句向客户端显示一条信息“学号必修以08开头”。
create trigger tri_n
on xs
for insert,update
as 
    declare @i char(6)
    select @i=学号 from inserted
    if @i not like '08%'
    begin
        ROLLBACK  TRANSACTION 
        RAISERROR ('学号必修以08开头,操作已经撤消!', 16, 10)
    end
go

--一一一一一一一一一一一一一一一一一一一一一

//插入数据
public void insertData(SQLiteDatabase db,String table,Article article){
    ContentValues values = new ContentValues();
    values.put("title",article.getTitle());
    values.put("author", article.getAuthor());

    db.insert(table, null, values);
}

//删除数据
public void deletData(SQLiteDatabase db,String table,Integer id){
    db.delete(table, "_id=?", new String[]{id.toString()});
}

//根据id修改数据
public void updataData(SQLiteDatabase db,String table,Integer id,Article article){
    ContentValues values = new ContentValues();
    values.put("title",article.getTitle());
    values.put("author", article.getAuthor());
    db.update(table, values, "_id=?", new String[]{id.toString()});
}

//根据id查询数据库
public Article selectData(SQLiteDatabase db,String table,Integer id){
    Cursor cursor = db.query(table,null, "_id=?", new String[]{id.toString()}, null, null, null);
    if(cursor.moveToFirst()){
        String title = cursor.getString(cursor.getColumnIndex("title"));
        String author = cursor.getString(cursor.getColumnIndex("author"));
        return new Article(title,author);
    }
    return null;
}

//查询数据库所有数据
public List<Article> selectDatas(SQLiteDatabase db,String table){
    List<Article> articles = new ArrayList<Article>();
    Cursor cursor = db.query(table,null, null, null, null, null, null);
    while(cursor.moveToNext()){
        int id = cursor.getInt(cursor.getColumnIndex("_id"));
        String title = cursor.getString(cursor.getColumnIndex("title"));

        articles.add(new Article(id,title));
    }
    return articles;
}
]]

--[[==============;;;=数据库操作==;;=============]]
--导入包
import "android.database.sqlite.*"

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 varchar(20))"
      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('"..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 deldata(da,d)
  --根据id更新数据,不更新创建时间
  if pcall(exec,"update "..tbname.." set t_data='"..da.."' where id="..d) then
    return true--成功
   else
    return false--失败
  end
end
--查询数库
function seldata(sql)
  local ddts={}
  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(ddts,{id=tid,date=tda,data=tde});
    end
    cursor.close()
   else
    --print("查询失败")
  end
  return ddts
end
--查询所有
function seldata()
  return seldata("select * from "..tbname)
end
--[[==============;;;=数据库操作==;;=============]]

sqlite一些知识

Mlua打包时

在项目文件夹中可自定义欢迎页面[welcome.png]和APP图标[icon.png],打包时可自动替换自定义的文件。