本地数据
概述
本地数据功能基于 设备本地 SQLite 数据库 与 页面设计能力(列表页 + 表单页) 实现。
通过中控服务,可将设备上的数据库数据同步至云控后台,实现:
- 远程查看数据
- 可视化编辑表格内容
- 批量导入、修改、删除
- 多表关联展示
功能架构说明
本功能本质上是对云控后台二次开发能力的扩展,主要包括:
- 列表页设计 → 用于展示数据
- 表单页设计 → 用于编辑数据
- SQLite 数据库 → 用于本地数据存储
三者组合,实现完整的数据管理能力。
学习前提
在使用本功能前,建议先掌握云控后台二次开发的基础能力,否则可能无法正确理解页面设计与数据结构之间的关系。
建议学习顺序如下:
数据库结构
数据库由 核心元数据表 和 业务数据表 两部分组成。
结构示例
本地数据.db
├── meta_list(列表元数据)
├── meta_form(表单元数据)
├── 数据管理(业务表)
├── 数据记录(业务表)
└── ...(其他业务表)
核心元数据表(必选)
以下两张表为系统运行的基础,必须存在且结构不可修改:
meta_list:用于定义列表(表格)展示结构meta_form:用于定义表单结构
主要作用:存储页面布局、字段配置、交互逻辑等元信息
业务数据表(自定义)
业务表用于存储实际数据,支持灵活扩展:
- 表名:完全自定义(支持中文)
- 字段:完全自定义(支持中文)
- 数量:可创建多个业务表
- 用途:承载具体业务数据,并与元数据表关联使用
表结构说明
meta_list(列表元数据)
用于定义列表展示结构及其关联关系:
id INTEGER PK 主键
label TEXT 列表名称
data TEXT 列表设计数据
dict TEXT 字典/配置
targetTable TEXT 关联业务表
source INTEGER 编辑表单来源(meta_form.id)
searchSource INTEGER 搜索表单来源(meta_form.id)
key TEXT 主键字段(一般为 id)
meta_form(表单元数据)
用于定义表单结构及字段配置:
id INTEGER PK 主键
label TEXT 表单名称
data TEXT 表单设计数据
dict TEXT 字典/配置
title TEXT 表单标题
targetTable TEXT 关联业务表
业务表(示例:数据管理)
用于存储实际业务数据(字段完全可自定义,支持中文):
id INTEGER PK 主键
label TEXT 标签
category_id INTEGER 分类ID
task_type_id INTEGER 任务类型ID
device_id INTEGER 设备ID
status INTEGER 状态
user_id INTEGER 用户ID
uid TEXT 唯一标识
created_at INTEGER 创建时间戳
upload TEXT 上传文件
input TEXT 输入框
textarea TEXT 多行文本
inputNumber INTEGER 数字输入
datePicker TEXT 日期选择
timePicker TEXT 时间选择
colorPicker TEXT 颜色选择
rate INTEGER 评分
slider INTEGER 滑块
switch INTEGER 开关
radio INTEGER 单选框
checkbox TEXT 多选框
select_field INTEGER 选择器
selectV2 INTEGER 选择器V2
treeSelect INTEGER 树形选择
image TEXT 图片
video TEXT 视频
play TEXT 播放
download TEXT 下载
copy TEXT 复制
link TEXT 链接
...
业务表(示例:数据记录)
用于存储实际业务数据(字段完全可自定义,支持中文):
id INTEGER PK 主键
label TEXT 标签
content TEXT 内容
status INTEGER 状态
created_at INTEGER 创建时间戳
data_list_id INTEGER 关联数据管理ID
关键关系说明
meta_list.targetTable→ 关联业务表meta_form.targetTable→ 关联业务表meta_list.source / searchSource→ 关联表单(meta_form.id)- 业务表之间可通过字段自行建立关联
数据库创建
可在后台创建并编辑 SQLite 模板,详情参阅 SQLite 数据库
完成数据库设计后,数据库可通过以下两种方式在设备端实现:
数据库文件分发
适用于已设计完成的 SQLite 数据库模板。
数据库文件(.db)可通过任意方式分发至设备,例如本地传输或远程下载等,实现快速部署与同步。
存放路径要求:
/sdcard/cloud/SQLite/
将数据库文件放入上述目录后,系统即可自动识别并使用。
脚本动态创建
适用于运行时初始化或动态生成数据库结构的场景。
无需依赖预置 .db 文件,可通过脚本在设备端直接创建表结构。
// 👉 示例调用
createLocalDataDB("/sdcard/cloud/SQLite/本地数据.db", "数据管理", "数据记录");
/**
* 创建【本地数据数据库模板】
*
* 📌 特点:
* - 支持主业务表 + 记录表完全动态化
* - 可用于任意业务模块复制(比如:订单 / 用户 / 脚本 / 日志)
* - 自动初始化 meta_list + meta_form + 示例数据
*
* @param {string} dbPath 数据库路径
* @param {string} mainTableName 主业务表(如:数据管理)
* @param {string} recordTableName 记录表(如:数据记录)
*/
function createLocalDataDB(dbPath, mainTableName, recordTableName) {
// =========================
// 0️⃣ 删除旧数据库
// =========================
var file = new java.io.File(dbPath);
if (file.exists()) {
file.delete();
console.log("🗑️ 已删除旧数据库:", dbPath);
}
var db = sqlite.open(dbPath);
try {
// =========================
// 1️⃣ 创建基础表
// =========================
db.execSQL(
"CREATE TABLE meta_list (" +
"id INTEGER NOT NULL PRIMARY KEY, " +
"label TEXT, " +
"data TEXT, " +
"dict TEXT, " +
"targetTable TEXT, " +
"source INTEGER, " +
"searchSource INTEGER, " +
"key TEXT" +
")"
);
db.execSQL(
"CREATE TABLE meta_form (" +
"id INTEGER NOT NULL PRIMARY KEY, " +
"label TEXT, " +
"data TEXT, " +
"dict TEXT, " +
"title TEXT, " +
"targetTable TEXT" +
")"
);
db.execSQL(
"CREATE TABLE " +
mainTableName +
" (" +
"id INTEGER NOT NULL PRIMARY KEY, " +
"label TEXT, " +
"category_id INTEGER, " +
"task_type_id INTEGER, " +
"device_id INTEGER, " +
"status INTEGER, " +
"user_id INTEGER, " +
"uid TEXT, " +
"created_at TEXT, " +
"upload TEXT, " +
"input TEXT, " +
"textarea TEXT, " +
"inputNumber INTEGER, " +
"datePicker TEXT, " +
"timePicker TEXT, " +
"colorPicker TEXT, " +
"rate INTEGER, " +
"slider INTEGER, " +
"switch INTEGER, " +
"radio INTEGER, " +
"checkbox TEXT, " +
"select_field INTEGER, " +
"selectV2 INTEGER, " +
"treeSelect INTEGER, " +
"image TEXT, " +
"video TEXT, " +
"play TEXT, " +
"download TEXT, " +
"copy TEXT, " +
"link TEXT" +
")"
);
db.execSQL(
"CREATE TABLE " +
recordTableName +
" (" +
"id INTEGER NOT NULL PRIMARY KEY, " +
"label TEXT, " +
"content TEXT, " +
"status INTEGER, " +
"created_at TEXT, " +
"data_list_id INTEGER" +
")"
);
// =========================
// 2️⃣ 初始化数据
// =========================
// meta_list(主表)
db.insert("meta_list", {
label: mainTableName + "表",
data: '{columns:[{label:"多选",fixed:"left",type:"selection"},{prop:"label",label:"标题",help:"",width:"150px",headerAlign:"center",align:"center",config:{type:"copy"}},{prop:"category_id",label:"分类",help:"",config:{dictKey:"category_id",type:"dictKey"},width:"120px",sortable:true,headerAlign:"center",align:"center"},{prop:"task_type_id",label:"任务类型",help:"我是帮助信息",config:{dictKey:"task_type_id",type:"dictKey"},width:"135",sortable:true,align:"center",headerAlign:"center"},{prop:"user_id",label:"用户",help:"",config:{dictKey:"user_id",type:"dictKey"},width:"120",sortable:true,align:"center",headerAlign:"center"},{prop:"device_id",label:"设备",help:"",config:{dictKey:"device_id",type:"dictKey"},width:"120",align:"center",headerAlign:"center"},{prop:"status",label:"状态",help:"",minWidth:"80",config:{type:"tagList",control:{style:{color:"blue"}},tagList:{0:"danger",1:"success"}},align:"center",headerAlign:"center"},{prop:"uid",label:"UID",help:"",minWidth:"120",align:"center",headerAlign:"center",sortable:true},{prop:"created_at",label:"创建日期",help:"",width:"180",align:"center",headerAlign:"center",config:{type:"formatter",formatter:"{y}-{m}-{d} {h}:{i}:{s}"}},{prop:"input",label:"单行文本",help:"",width:"120",headerAlign:"center",align:"center",config:{type:"field",field:"input",control:{clearable:true}}},{prop:"textarea",label:"多行文本",help:"",width:"180",headerAlign:"center",align:"center",config:{type:"field",field:"textarea"}},{prop:"inputNumber",label:"计数器",help:"",headerAlign:"center",align:"center",config:{type:"field",field:"inputNumber"},width:"180"},{prop:"datePicker",label:"日期选择器",help:"",headerAlign:"center",align:"center",config:{type:"field",field:"datePicker",control:{style:{width:"180px"}}},width:"210"},{prop:"timePicker",label:"时间选择器",help:"",width:"160",headerAlign:"center",align:"center",config:{type:"field",field:"timePicker",control:{style:{width:"120px"}}}},{prop:"colorPicker",label:"取色器",help:"",width:"80",headerAlign:"center",align:"center",config:{type:"field",field:"colorPicker"}},{prop:"rate",label:"评分",help:"",headerAlign:"center",align:"center",config:{type:"field",field:"rate"},width:"180"},{prop:"slider",label:"滑块",help:"",headerAlign:"center",align:"center",config:{type:"field",field:"slider",control:{min:0,max:100,step:5}},width:"150"},{prop:"switch",label:"开关",help:"",width:"160",headerAlign:"center",align:"center",config:{type:"field",field:"switch",control:{activeValue:1,inactiveValue:0,activeText:"开启",inactiveText:"关闭"}}},{prop:"radio",label:"单选框",config:{type:"field",field:"radio",control:{style:{width:"300px"},disabled:true},options:[{label:"选项1",value:1},{label:"选项2",value:2},{label:"选项3",value:3}]},width:"320",sortable:true,align:"center",headerAlign:"center"},{prop:"checkbox",label:"多选框",config:{type:"field",field:"checkbox",control:{style:{width:"300px"}},options:[{label:"选项1",value:1},{label:"选项2",value:2},{label:"选项3",value:3}]},width:"320",sortable:true,align:"center",headerAlign:"center"},{prop:"image",label:"图片/文件",help:"",config:{type:"image",control:{previewTeleported:true,closeOnPressEscape:true,lazy:true,hideOnClickModal:true,zoomRate:1.2,maxScale:7,minScale:0.2,style:{width:"80px"}}},width:"200",align:"center",headerAlign:"center"},{prop:"video",label:"视频",help:"",minWidth:"500",align:"center",headerAlign:"center",sortable:true,config:{type:"video",control:{style:{maxWidth:"31%",margin:"2px",height:"auto"}}}},{prop:"play",label:"播放",help:"",config:{type:"play",control:{style:{overflow:"hidden",color:"#007bff",textDecoration:"underline",textOverflow:"ellipsis",whiteSpace:"nowrap"}}},headerAlign:"center",align:"center",minWidth:"180"},{prop:"download",label:"下载链接",help:"",config:{type:"download",control:{style:{color:"#007bff",textDecoration:"underline"}}},width:"120",align:"center",headerAlign:"center"},{prop:"copy",label:"复制文本",help:"",width:"120",headerAlign:"center",align:"center",config:{type:"copy",control:{style:{color:"#007bff"}}}},{prop:"link",label:"超链接",help:"",minWidth:"120",config:{type:"link",control:{style:{overflow:"hidden",color:"#007bff",textDecoration:"underline",textOverflow:"ellipsis",whiteSpace:"nowrap"}}},align:"center",headerAlign:"center"},{label:"操作",prop:"__control",width:"400px",fixed:"right",align:"center",headerAlign:"center"}],controlBtn:[{label:"新增",key:"add",type:"primary",size:"small",icon:"CirclePlus",plain:false,circle:false,link:false},{label:"导入Excel",key:"import",type:"primary",size:"small",icon:"Upload",plain:true,circle:false,link:false,config:{type:"excel",fileName:"云控数据表",sheetName:"Sheet1",template:[{label:"我是标题1",category_id:74,task_type_id:1,device_id:58870,status:1,user_id:382,uid:"我是UID",created_at:"2026-04-05T01:39:36.000Z",upload:"http://47.94.105.29:66/storage/folder/ceshi3/20260405/102022/logo-og.png",inputNumber:3,input:"我是单行文本",textarea:"我是多行文本",datePicker:"2026-04-05T01:39:36.000Z",timePicker:"2026-04-05T01:39:24.000Z",colorPicker:"#FC1D1D",rate:4,slider:51,switch:1,radio:3,checkbox:"[\\n 2\\n]",image:"http://47.94.105.29:66/storage/folder/username/20240422/030638/01.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/02.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/03.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/04.jpg",video:"http://47.94.105.29:66/storage/folder/username/20240422/030621/01.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/02.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/03.mp4",play:"http://47.94.105.29:66/storage/folder/username/20240422/111406/02.mp4",download:"http://47.94.105.29:66/storage/folder/username/20240422/111359/03.mp4",copy:"点我复制",link:"https://www.baidu.com"},{label:"我是标题2",category_id:74,task_type_id:1,device_id:58870,status:0,user_id:382,uid:"我是UID",created_at:"2026-04-05T01:39:36.000Z",upload:"http://47.94.105.29:66/storage/folder/ceshi3/20260405/102022/logo-og.png",inputNumber:3,input:"我是单行文本",textarea:"我是多行文本",datePicker:"2026-04-05T01:39:36.000Z",timePicker:"2026-04-05T01:39:24.000Z",colorPicker:"#FC1D1D",rate:4,slider:51,switch:1,radio:3,checkbox:"[\\n 2\\n]",image:"http://47.94.105.29:66/storage/folder/username/20240422/030638/01.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/02.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/03.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/04.jpg",video:"http://47.94.105.29:66/storage/folder/username/20240422/030621/01.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/02.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/03.mp4",play:"http://47.94.105.29:66/storage/folder/username/20240422/111406/02.mp4",download:"http://47.94.105.29:66/storage/folder/username/20240422/111359/03.mp4",copy:"点我复制",link:"https://www.baidu.com"}]}},{label:"导入文本",key:"import",type:"primary",size:"small",icon:"Upload",plain:true,circle:false,link:false,config:{type:"txt",fileName:"云控文本",separator:" | ",template:[{label:"我是标题1",category_id:74,task_type_id:1,device_id:58870,status:1,user_id:382,uid:"我是UID",created_at:"2026-04-05T01:39:36.000Z",upload:"http://47.94.105.29:66/storage/folder/ceshi3/20260405/102022/logo-og.png",inputNumber:3,input:"我是单行文本",textarea:"我是多行文本",datePicker:"2026-04-05T01:39:36.000Z",timePicker:"2026-04-05T01:39:24.000Z",colorPicker:"#FC1D1D",rate:4,slider:51,switch:1,radio:3,checkbox:"[\\n 2\\n]",image:"http://47.94.105.29:66/storage/folder/username/20240422/030638/01.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/02.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/03.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/04.jpg",video:"http://47.94.105.29:66/storage/folder/username/20240422/030621/01.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/02.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/03.mp4",play:"http://47.94.105.29:66/storage/folder/username/20240422/111406/02.mp4",download:"http://47.94.105.29:66/storage/folder/username/20240422/111359/03.mp4",copy:"点我复制",link:"https://www.baidu.com"},{label:"我是标题2",category_id:74,task_type_id:1,device_id:58870,status:0,user_id:382,uid:"我是UID",created_at:"2026-04-05T01:39:36.000Z",upload:"http://47.94.105.29:66/storage/folder/ceshi3/20260405/102022/logo-og.png",inputNumber:3,input:"我是单行文本",textarea:"我是多行文本",datePicker:"2026-04-05T01:39:36.000Z",timePicker:"2026-04-05T01:39:24.000Z",colorPicker:"#FC1D1D",rate:4,slider:51,switch:1,radio:3,checkbox:"[\\n 2\\n]",image:"http://47.94.105.29:66/storage/folder/username/20240422/030638/01.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/02.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/03.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/04.jpg",video:"http://47.94.105.29:66/storage/folder/username/20240422/030621/01.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/02.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/03.mp4",play:"http://47.94.105.29:66/storage/folder/username/20240422/111406/02.mp4",download:"http://47.94.105.29:66/storage/folder/username/20240422/111359/03.mp4",copy:"点我复制",link:"https://www.baidu.com"}]}},{label:"导出Excel",key:"export",type:"primary",size:"small",icon:"Download",plain:true,circle:false,link:false,config:{type:"excel",fileName:"云控数据表",date:false,sheetName:"Sheet1"}},{label:"导出文本",key:"export",type:"primary",size:"small",icon:"Download",plain:true,circle:false,link:false,config:{type:"txt",fileName:"云控文本",date:false,separator:" | "}},{label:"批量编辑",key:"edit",type:"primary",size:"small",icon:"Edit",plain:true,circle:false,link:false,config:{source:4}},{label:"批量编辑1",key:"edit1",type:"primary",size:"small",icon:"Edit",plain:true,circle:false,link:false,config:{source:5}},{label:"跳转链接",key:"url",type:"primary",size:"small",icon:"ChromeFilled",plain:true,circle:false,link:false,config:{url:"https://www.baidu.com/"}},{label:"跳转链接1",key:"url1",type:"primary",size:"small",icon:"ChromeFilled",plain:true,circle:false,link:false,config:{url:"https://cn.bing.com/"}},{label:"批量删除",key:"del",type:"danger",size:"small",icon:"Delete",plain:true,circle:false,link:false}],operateBtn:[{label:"编辑",key:"edit",type:"primary",size:"small",icon:"Edit",plain:true,circle:false,link:false},{label:"编辑1",key:"edit1",type:"primary",size:"small",icon:"Edit",plain:true,circle:false,link:false,config:{source:3,openType:"dialog"}},{label:"列表",key:"list",type:"primary",size:"small",icon:"Memo",plain:true,circle:false,link:false,config:{source:2,openType:"dialog",key:"data_list_id"}},{label:"列表1",key:"list1",type:"primary",size:"small",icon:"Memo",plain:true,circle:false,link:false,config:{source:2,openType:"dialog",key:"data_list_id"}},{label:"删除",key:"del",type:"danger",size:"small",icon:"Delete",plain:true,circle:false,link:false}],treeData:{show:true,nodeKey:"id",treeProps:{label:"label",value:"id",children:"children"},name:"category_id",method:"post",requestUrl:"http://47.94.105.29:66/api/DataListCaseCategoryTree"},tableProps:{border:true},config:{operateDropdown:"4",openType:"drawer",pageSize:10,sortField:"id desc",delKey:"id",expand:true,searchJump:false,columnsSetting:true,width:"80%"},notice:{content:"一个功能强大的手机端页面管理系统,支持表单、列表和数据大屏页面,并具有自定义菜单路由功能。用户可以创建任意数量的菜单页面,并从各种组件中选择所需的功能。还支持批量导入、编辑、上传、删除、页面关联等操作,无需用户进行前端开发。所有数据直接存储在用户手机本地,无需数据库和服务器,通过中控服务与手机端实时交互数据。此外,用户可以共享创建的页面菜单给下级用户使用,并通过推广代理角色权限设置进行管理。",control:{style:{color:"#ff0000"}}},list:[],form:{}}',
dict: '{\n "task_type_id": {\n "1": "任务类型1",\n "2": "任务类型2",\n "3": "任务类型3",\n "4": "任务类型4"\n }\n}',
targetTable: mainTableName,
source: 1,
searchSource: 2,
key: "id",
});
// meta_list(记录表)
db.insert("meta_list", {
label: recordTableName + "表",
data: '{columns:[{label:"多选",fixed:"left",type:"selection"},{prop:"label",label:"标题",help:"",width:"150px",headerAlign:"center",align:"center",config:{type:"copy"}},{prop:"content",label:"内容",help:"",minWidth:"120",align:"center",headerAlign:"center",sortable:true},{prop:"status",label:"结果",help:"",width:"160",headerAlign:"center",align:"center",config:{type:"field",field:"switch",control:{activeValue:1,inactiveValue:0,activeText:"成功",inactiveText:"失败",disabled:true}}},{prop:"created_at",label:"创建日期",help:"",width:"180",align:"center",headerAlign:"center",config:{type:"formatter",formatter:"{y}-{m}-{d} {h}:{i}:{s}"}},{label:"操作",prop:"__control",width:"160px",fixed:"right",align:"center",headerAlign:"center"}],tableProps:{border:true},config:{operateDropdown:"4",openType:"drawer",pageSize:10,sortField:"id desc",delKey:"id",expand:true,searchJump:false,columnsSetting:true,width:"80%"},controlBtn:[{label:"批量删除",key:"del",type:"danger",size:"small",icon:"Delete",plain:true,circle:false,link:false}],operateBtn:[{label:"编辑",key:"edit",type:"primary",size:"small",icon:"Edit",plain:true,circle:false,link:false},{label:"删除",key:"del",type:"danger",size:"small",icon:"Delete",plain:true,circle:false,link:false}],list:[],form:{}}',
dict: "{}",
targetTable: recordTableName,
source: 6,
searchSource: 7,
key: "id",
});
// =========================
// 3️⃣ 主业务数据
// =========================
db.insert(mainTableName, {
label: "示例任务一 - 数据处理流程",
category_id: 73,
task_type_id: 1,
device_id: 58870,
status: 1,
user_id: 382,
uid: "我是UID",
created_at: "2026-04-05T01:39:36.000Z",
upload: "http://47.94.105.29:66/storage/folder/ceshi3/20260405/102022/logo-og.png",
input: "我是单行文本",
textarea: "我是多行文本",
inputNumber: 3,
datePicker: "2026-04-05T01:39:36.000Z",
timePicker: "2026-04-05T01:39:24.000Z",
colorPicker: "#FC1D1D",
rate: 4,
slider: 51,
switch: 1,
radio: 3,
checkbox: "[\n 2\n]",
image:
"http://47.94.105.29:66/storage/folder/username/20240422/030638/01.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/02.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/03.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/04.jpg",
video:
"http://47.94.105.29:66/storage/folder/username/20240422/030621/01.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/02.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/03.mp4",
play: "http://47.94.105.29:66/storage/folder/username/20240422/111406/02.mp4",
download: "http://47.94.105.29:66/storage/folder/username/20240422/111359/03.mp4",
copy: "点我复制",
link: "https://www.baidu.com",
});
db.insert(mainTableName, {
label: "示例任务二 - 信息更新流程",
category_id: 73,
task_type_id: 1,
device_id: 58870,
status: 1,
user_id: 382,
uid: "我是UID",
created_at: "2026-04-05T01:39:36.000Z",
upload: "http://47.94.105.29:66/storage/folder/ceshi3/20260405/102022/logo-og.png",
input: "我是单行文本",
textarea: "我是多行文本",
inputNumber: 3,
datePicker: "2026-04-05T01:39:36.000Z",
timePicker: "2026-04-05T01:39:24.000Z",
colorPicker: "#FC1D1D",
rate: 4,
slider: 51,
switch: 1,
radio: 3,
checkbox: "[\n 2\n]",
image:
"http://47.94.105.29:66/storage/folder/username/20240422/030638/01.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/02.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/03.jpg,http://47.94.105.29:66/storage/folder/username/20240422/030638/04.jpg",
video:
"http://47.94.105.29:66/storage/folder/username/20240422/030621/01.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/02.mp4,http://47.94.105.29:66/storage/folder/username/20240422/030622/03.mp4",
play: "http://47.94.105.29:66/storage/folder/username/20240422/111406/02.mp4",
download: "http://47.94.105.29:66/storage/folder/username/20240422/111359/03.mp4",
copy: "点我复制",
link: "https://www.baidu.com",
});
// =========================
// 4️⃣ 记录表数据
// =========================
db.insert(recordTableName, {
label: "执行记录 - 成功",
content: "本次流程已正常完成,相关数据已更新",
status: 1,
created_at: "2026/4/12 09:57:11",
data_list_id: 1,
});
db.insert(recordTableName, {
label: "执行记录 - 异常",
content: "执行过程中出现异常,已记录日志以便后续处理",
status: 0,
created_at: "2026/4/12 09:57:11",
data_list_id: 2,
});
// =========================
// 5️⃣ meta_form(简化)
// =========================
db.insert("meta_form", {
label: "编辑新增(" + mainTableName + ")",
data: '{list:[{type:"input",control:{modelValue:"",placeholder:"请输入标题"},config:{},name:"label",formItem:{label:"标题",rules:[{required:true,message:"必填项",trigger:"blur"},{max:20,message:"长度不能超过20个字符",trigger:"blur"}]}},{type:"selectPlus",control:{modelValue:"",appendToBody:true,valueKey:"id",filterable:true,props:{label:"label",value:"id"}},options:[],config:{optionsType:1,optionsFun:"http://47.94.105.29:66/api/DataListCaseCategoryList",method:"post",addUrl:"http://47.94.105.29:66/api/addDataListCaseCategory",editUrl:"http://47.94.105.29:66/api/editDataListCaseCategory",deleteUrl:"http://47.94.105.29:66/api/deleteDataListCaseCategory"},name:"category_id",formItem:{label:"分类"}},{type:"select",control:{modelValue:"",appendToBody:true,placeholder:"请选择任务类型"},options:[{label:"任务类型1",value:1},{label:"任务类型2",value:2},{label:"任务类型3",value:3},{label:"任务类型4",value:4}],config:{optionsType:1,optionsFun:"http://47.94.105.29:66/api/getFieldTaskTypeIdDict",method:"post"},name:"task_type_id",formItem:{label:"任务类型"}},{type:"select",control:{modelValue:"",appendToBody:true},options:[],config:{optionsType:1,optionsFun:"http://180.76.145.80/api/getUserList",method:"post",label:"",value:"id"},name:"user_id",formItem:{label:"选择用户"}},{type:"select",control:{modelValue:"",appendToBody:true},options:[],config:{optionsType:1,optionsFun:"http://180.76.145.80/api/getDeviceAllList",method:"post",value:"id",label:""},name:"device_id",formItem:{label:"选择设备"}},{type:"input",control:{modelValue:"",placeholder:"请输入uid"},config:{},name:"uid",formItem:{label:"UID"}},{type:"input",control:{modelValue:"",placeholder:"请输入单行文本"},config:{},name:"input",formItem:{label:"单行文本"}},{type:"textarea",control:{modelValue:"",placeholder:"请输入多行文本"},config:{},name:"textarea",formItem:{label:"多行文本"}},{type:"inputNumber",control:{modelValue:0},config:{},name:"inputNumber",formItem:{label:"计数器"}},{type:"datePicker",control:{modelValue:"",type:"datetime"},config:{},name:"datePicker",formItem:{label:"日期选择器"}},{type:"timePicker",control:{modelValue:""},config:{},name:"timePicker",formItem:{label:"时间选择器"}},{type:"colorPicker",control:{modelValue:""},config:{},name:"colorPicker",formItem:{label:"取色器"}},{type:"rate",control:{modelValue:0},config:{},name:"rate",formItem:{label:"评分"}},{type:"slider",control:{modelValue:0,min:0,max:100,step:5},config:{},name:"slider",formItem:{label:"滑块"}},{type:"switch",control:{modelValue:false,activeValue:1,inactiveValue:0},config:{},name:"switch",formItem:{label:"开关"}},{type:"radio",control:{modelValue:1},options:[{label:"选项1",value:1},{label:"选项2",value:2},{label:"选项3",value:3}],config:{optionsType:1,transformData:"number"},name:"radio",formItem:{label:"单选框组"}},{type:"checkbox",control:{modelValue:[]},options:[{label:"选项1",value:1},{label:"选项2",value:2},{label:"选项3",value:3}],config:{optionsType:0,transformData:"number"},name:"checkbox",formItem:{label:"多选框组"}},{type:"upload",control:{modelValue:"",action:"http://47.94.105.29:66/api/upload",multiple:true,limit:4,listType:"picture-card"},config:{tip:"",btnText:""},name:"upload",formItem:{label:"图片文件上传"}},{type:"upload",control:{modelValue:"",action:"http://47.94.105.29:66/api/upload",multiple:true,limit:4,listType:"picture-card"},config:{},name:"image",formItem:{label:"图片/文件"}},{type:"upload",control:{modelValue:"",action:"http://47.94.105.29:66/api/upload",limit:4,drag:true},config:{},name:"video",formItem:{label:"视频文件"}},{type:"upload",control:{modelValue:"",action:"http://47.94.105.29:66/api/upload"},config:{},name:"download",formItem:{label:"下载链接"}},{type:"upload",control:{modelValue:"",action:"http://47.94.105.29:66/api/upload"},config:{},name:"play",formItem:{label:"播放"}},{type:"input",control:{modelValue:""},config:{},name:"copy",formItem:{label:"复制文本"}},{type:"input",control:{modelValue:"",placeholder:"请输入链接"},config:{},name:"link",formItem:{label:"超链接"}}],form:{size:"default",labelWidth:"100px"},config:{submitCancel:true}}',
dict: "{}",
title: "label",
targetTable: "",
});
db.insert("meta_form", {
label: "搜索(" + mainTableName + ")",
data: '{list:[{type:"input",control:{modelValue:"",placeholder:"请输入标题"},config:{},name:"label",formItem:{label:"标题"}},{type:"input",control:{modelValue:"",placeholder:"请输入链接"},config:{},name:"link",formItem:{label:"链接"}},{type:"input",control:{modelValue:"",placeholder:"请输入uid"},config:{},name:"uid",formItem:{label:"UID"}},{type:"select",control:{modelValue:"",appendToBody:true,placeholder:"请选择任务类型"},options:[{label:"任务类型1",value:"1"},{label:"任务类型2",value:"2"},{label:"任务类型3",value:"3"},{label:"任务类型4",value:"4"}],config:{optionsType:1,optionsFun:"http://47.94.105.29:66/api/getFieldTaskTypeIdDict",method:"post"},name:"task_type_id",formItem:{label:"任务类型"}},{type:"select",control:{modelValue:"",appendToBody:true},options:[],config:{optionsType:1,optionsFun:"http://47.94.105.29:66/api/DataListCaseCategoryTree",method:"post",value:"id",label:""},name:"category_id",formItem:{label:"选择分类"}},{type:"select",control:{modelValue:"",appendToBody:true},options:[],config:{optionsType:1,optionsFun:"http://180.76.145.80/api/getDeviceAllList",method:"post",value:"id",label:""},name:"device_id",formItem:{label:"选择设备"}},{type:"select",control:{modelValue:"",appendToBody:true},options:[],config:{optionsType:1,optionsFun:"http://180.76.145.80/api/getUserList",method:"post",label:"",value:"id"},name:"user_id",formItem:{label:"选择用户"}}],form:{size:"default",labelWidth:"100px"},config:{submitCancel:true,submitUrl:"http://47.94.105.29:66/api/addDataListCase",editUrl:"http://47.94.105.29:66/api/editDataListCase",requestUrl:"http://47.94.105.29:66/api/getDataListCase"}}',
dict: "",
title: "label",
targetTable: "",
});
db.insert("meta_form", {
label: "编辑1(" + mainTableName + ")",
data: '{list:[{type:"input",control:{modelValue:"",placeholder:"请输入标题"},config:{},name:"label",formItem:{label:"标题"}}],form:{size:"default",labelWidth:"100px"},config:{submitCancel:true,submitUrl:"http://47.94.105.29:66/api/addDataListCase",editUrl:"http://47.94.105.29:66/api/editDataListCase",requestUrl:"http://47.94.105.29:66/api/getDataListCase"}}',
dict: "",
title: "label",
targetTable: "",
});
db.insert("meta_form", {
label: "批量编辑(" + mainTableName + ")",
data: '{list:[{type:"input",control:{modelValue:""},config:{},name:"label",formItem:{label:"标题"}},{type:"selectPlus",control:{modelValue:"",appendToBody:true,valueKey:"id",filterable:true,props:{label:"label",value:"id"}},options:[],config:{optionsType:1,optionsFun:"http://47.94.105.29:66/api/DataListCaseCategoryList",method:"post",addUrl:"http://47.94.105.29:66/api/addDataListCaseCategory",editUrl:"http://47.94.105.29:66/api/editDataListCaseCategory",deleteUrl:"http://47.94.105.29:66/api/deleteDataListCaseCategory"},name:"category_id",formItem:{label:"分类"}}],form:{size:"default"},config:{requestUrl:"http://47.94.105.29:66/api/getBatchDataListCase",editUrl:"http://47.94.105.29:66/api/editBatchDataListCase",submitCancel:true}}',
dict: "",
title: "label",
targetTable: "",
});
db.insert("meta_form", {
label: "批量编辑1(" + mainTableName + ")",
data: '{list:[{type:"input",control:{modelValue:""},config:{},name:"label",formItem:{label:"标题"}},{type:"select",control:{modelValue:"",appendToBody:true},options:[],config:{optionsType:2,optionsFun:""},name:"task_type_id",formItem:{label:"任务类型"}}],form:{size:"default"},config:{requestUrl:"http://47.94.105.29:66/api/getBatchDataListCase",editUrl:"http://47.94.105.29:66/api/editBatchDataListCase",submitCancel:true}}',
dict: '{\n "task_type_id": {\n "1": "任务类型1",\n "2": "任务类型2",\n "3": "任务类型3",\n "4": "任务类型4"\n }\n}',
title: "label",
targetTable: "",
});
db.insert("meta_form", {
label: "编辑新增(" + recordTableName + ")",
data: '{list:[{type:"input",control:{modelValue:"",placeholder:"请输入标题"},config:{},name:"label",formItem:{label:"标题"}},{type:"input",control:{modelValue:"",placeholder:"请输入内容"},config:{},name:"content",formItem:{label:"内容"}}],form:{size:"default",labelWidth:"100px"},config:{submitCancel:true}}',
dict: "",
title: "label",
targetTable: "",
});
db.insert("meta_form", {
label: "搜索(" + recordTableName + ")",
data: '{list:[{type:"input",control:{modelValue:"",placeholder:"请输入标题"},config:{},name:"label",formItem:{label:"标题"}},{type:"input",control:{modelValue:"",placeholder:"请输入内容"},config:{},name:"content",formItem:{label:"内容"}}],form:{size:"default",labelWidth:"100px"},config:{submitCancel:true}}',
dict: "",
title: "label",
targetTable: "",
});
console.log("✅ 数据库创建完成:", dbPath);
} catch (e) {
console.error("❌ 创建失败:", e);
} finally {
db.close();
}
}
使用脚本操作本地数据
在业务执行过程中,可通过脚本直接操作设备本地 SQLite 数据库,对业务数据进行统一管理与持久化存储。
所有数据最终写入设备本地 .db 文件,并可在云控后台进行同步与查看,实现本地计算 + 云端可视化管理的架构模式。
通过 Bot.js Pro 提供的 sqlite 模块,脚本层支持以下标准数据库操作:
- 新增数据(INSERT)
- 查询数据(SELECT)
- 条件查询(WHERE)
- 更新数据(UPDATE)
- 删除数据(DELETE)
新增(INSERT)
用于向指定业务表插入一条数据记录。
var id = insertRow(
"/sdcard/cloud/SQLite/本地数据.db",
"数据记录",
{
label: "任务A",
content: "执行内容",
status: 1,
created_at: new Date().toISOString(),
data_list_id: 1
}
);
console.log("✅ 插入成功 ID =", id);
function insertRow(dbPath, tableName, data) {
var db = sqlite.open(dbPath);
try {
return db.insert(tableName, data);
} finally {
db.close();
}
}
查询(SELECT)
用于查询指定表中的全部数据。
var list = queryAll("/sdcard/cloud/SQLite/本地数据.db", "数据记录");
console.log("📦 查询全部:", list);
function queryAll(dbPath, tableName) {
var db = sqlite.open(dbPath);
try {
// ⚠️ 不用反引号,但要确保表名是可信的(避免SQL注入风险)
return db.rawQuery("SELECT * FROM " + tableName, null).all();
} finally {
db.close();
}
}
条件查询(WHERE)
用于根据条件筛选数据记录。
var list = queryWhere(
"/sdcard/cloud/SQLite/本地数据.db",
"数据记录",
"status = ?",
[1]
);
console.log("📦 条件查询:", list);
function queryWhere(dbPath, tableName, whereSql, args) {
var db = sqlite.open(dbPath);
try {
var sql = "SELECT * FROM " + tableName + " WHERE " + whereSql;
return db.rawQuery(sql, args || null).all();
} finally {
db.close();
}
}
更新(UPDATE)
用于更新指定 ID 的数据内容。
var rows = updateRow(
"/sdcard/cloud/SQLite/本地数据.db",
"数据记录",
1,
{
label: "已更新任务",
status: 0
}
);
console.log("🔄 更新结果 rows =", rows);
function updateRow(dbPath, tableName, id, data) {
var db = sqlite.open(dbPath);
try {
return db.update(
tableName,
data,
"id = ?",
[id]
);
} finally {
db.close();
}
}
删除(DELETE)
用于删除指定 ID 的数据记录。
var rows = deleteRow(
"/sdcard/cloud/SQLite/本地数据.db",
"数据记录",
2
);
console.log("🗑️ 删除结果 rows =", rows);
function deleteRow(dbPath, tableName, id) {
var db = sqlite.open(dbPath);
try {
return db.delete(
tableName,
"id = ?",
[id]
);
} finally {
db.close();
}
}