Autojs: 使用 SQLite
例子
let db = new SQLiteUtil("/sdcard/A_My_DB/sqlite.db");db.fastCreateTable("user_table",{name: "",online: false,},["name"] // 设置 name 为唯一, 重复项 不会添加成功
);// 新增数据的 ID
let row_id = db.insert("user_table", {name: "小明5",online: true,
});if (row_id == -1) {console.log("新增失败");
}
console.log("新数据的ID", row_id);// 查询一条
// arr = db.find("select * from user_table limit 1");// for (let i = 0; i < arr.length; i++) {
// let item = arr[i];
// console.log(item);
// }// 其他都类似, 需要把一条标准 sql 的几个部分拆开,分别当做参数传入
let r2 = db.update("user_table", { online: false }, "name=? and online = ?", ["小明5", 1]);
if (r2 == 0) {console.log("修改失败");
}
console.log("受影响的行数", r2);// 拼接字符串时, 要注意 "文本" 类型要加双引号
// db.execSQL("update user_table set online = 0 where name='小明2'");find_all();db.deleteDbFile()function find_all() {let arr = db.find("select * from user_table");for (let i = 0; i < arr.length; i++) {let item = arr[i];console.log(item);}
}
代码
// https://developer.android.com/reference/android/database/sqlite/SQLiteDatabase
// https://www.apiref.com/android-zh/android/database/sqlite/SQLiteDatabase.html
/*** sqlite for auto.js* @example* let db = new SQLiteUtil("/sdcard/A_My_DB/sqlite.db");* @param {*} filePath 地址*/
var SQLiteUtil = /** @class */ (function () {function SQLiteUtil(file_path) {// 导入必要的 java classimportClass(android.database.sqlite.SQLiteDatabase);importClass(android.content.ContentValues);this._db_file_path = file_path;}/** 根据 json 键值 快速建表** (简便函数,如果你的需求很复杂,可以自己调用 execSQL)* @public* @param {string} tableName 表名* @param {object} data json 数据 ,值没有实际意义, 只是用来判断类型, 例子: { name: '', age : 0, online : false}* @param {string[] | undefined} uniqueArr 唯一, 例子: ["name"]*/SQLiteUtil.prototype.fastCreateTable = function (tableName, data, uniqueArr) {var columnArr = [];var itemName = "";// 拼接数据类型for (var key in data) {//this._log((typeof data[key]) + data[key])// 如果有其他类型需求, 请使用 createTableswitch (typeof data[key]) {case "number":itemName = key + " INTEGER DEFAULT 0";break;case "boolean":itemName = key + " INTEGER DEFAULT 0";break;default:itemName = key + " TEXT DEFAULT ''";break;}if (uniqueArr != undefined && uniqueArr.indexOf(key) > -1) {itemName += " unique";}columnArr.push(itemName);}// 创建this.createTable(tableName, columnArr);};/** 创建表** (简便函数,如果你的需求很复杂,可以自己调用 execSQL)** (默认添加一个 自增的 id 属性)* @public* @param {string} tableName 表名* @param {string[]} columns 参数列名 数组, 源码中会用 逗号拼接* @example* ("user_table",["name TEXT DEFAULT '' unique","count INTEGER DEFAULT 0"])*/SQLiteUtil.prototype.createTable = function (tableName, columns) {this._log("init", columns);try {// 创建目录files.ensureDir(this._db_file_path);// 创建表this.execSQL("create table IF NOT EXISTS " + tableName + "(id integer primary key autoincrement," + columns.join(",") + ")");}catch (e) {this._error("createTable error: " + e);throw e;}};/** 查询** (查询一条,请拼接 limit 1)* @public* @example* db.find("select * from " + tableName + " where name='123'");* @param {string} sqlStr sql 字符串* @returns {object[]} json 数组*/SQLiteUtil.prototype.find = function (sqlStr) {this._log("find");var res = [];var db;try {db = this._getDBConnection();// 执行 sql ,并通过 游标 取出所有数据 ( 安卓返回值只有游标,不会直接返回数据 )res = this._getCursorDataArr(db.rawQuery(sqlStr, null));}catch (e) {this._error("find error: " + e);throw e;}finally {db && db.close();}return res;};/** 插入** @public* @param {string} tableName 表名* @param {object} jsonObj json 数据对象, 例子: { name : "123", age : 1 }* @param {string?} nullColumnHack 可以不传,一般为 null 即可 https://www.iteye.com/blog/mofan-1412262* @returns {number} 插入的行 ID ;如果发生错误,则返回-1*/SQLiteUtil.prototype.insert = function (tableName, jsonObj, nullColumnHack) {this._log("insert");nullColumnHack = nullColumnHack || undefined;var res = -1;var db;try {db = this._getDBConnection();db.beginTransaction();res = db.insert(tableName, nullColumnHack, this._getContentValues(jsonObj));db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交。}catch (e) {this._error("insert error: " + e);throw e;}finally {db && db.endTransaction();db && db.close();}return res;};/** 删除* @public* @example* db.delete(tableName,"name=?",["1名字"])* @param {string} tableName 表名* @param {string} whereClause where 条件* @param {any[]} whereArgs where 条件的参数* @returns {number} 如果传入 whereClause,则受影响的行数,否则为 0 。要删除所有行并获得计数,请将“1”作为 whereClause。*/SQLiteUtil.prototype.delete = function (tableName, whereClause, whereArgs) {this._log("delete");var res = 0;var db;try {db = this._getDBConnection();db.beginTransaction();res = db.delete(tableName, whereClause, whereArgs);db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交。}catch (e) {this._error("delete error: " + e);throw e;}finally {db && db.endTransaction();db && db.close();}return res;};/** 更新* @public* @example* db.update(tableName,{"address":"哈哈哈"},"user_name=?",["13235919724"])* @param tableName 表名* @param jsonObj json 对象* @param whereClause where 条件* @param whereArgs where 条件的参数* @returns {number} 受影响的行数*/SQLiteUtil.prototype.update = function (tableName, jsonObj, whereClause, whereArgs) {this._log("update");var res = 0;var db;try {db = this._getDBConnection();res = db.update(tableName, this._getContentValues(jsonObj), whereClause, whereArgs);}catch (e) {this._error("update error: " + e);throw e;}finally {db && db.close();}return res;};/** 替换数据库中一行的便捷函数。 如果行不存在,则插入新行。** !!!! 当表有一个 PRIMARY KEY 或 UNIQUE 索引才有意义* @public* @example* https://blog.csdn.net/wangyanguiyiyang/article/details/51126590* @param {string} tableName 表名* @param {object} jsonObj json 对象* @param {string?} nullColumnHack 一般为null即可 https://www.iteye.com/blog/mofan-1412262* @returns {number} 新插入的行的行ID;如果发生错误,则返回-1*/SQLiteUtil.prototype.replace = function (tableName, jsonObj, nullColumnHack) {nullColumnHack = nullColumnHack || undefined;var res = -1;var db;try {db = this._getDBConnection();res = db.replace(tableName, nullColumnHack, this._getContentValues(jsonObj));}catch (e) {this._error("replace error: " + e);throw e;}finally {db && db.close();}return res;};/** 删除表* @public* @param {string} tableName 表名*/SQLiteUtil.prototype.dropTable = function (tableName) {try {this.execSQL("drop table if exists " + tableName);}catch (e) {this._error("dropTable error: " + e);throw e;}};/** 清空表* @public* @param {string} tableName 表名*/SQLiteUtil.prototype.clearTable = function (tableName) {try {this.execSQL("delete from " + tableName);}catch (e) {this._error("clearTable error: " + e);throw e;}};/** 表索引序列归0* @public* @param {string} tableName 表名*/SQLiteUtil.prototype.resetTableSequence = function (tableName) {try {this.execSQL("UPDATE sqlite_sequence SET seq = 0 WHERE name = '" + tableName + "'");}catch (e) {this._error("resetTableSequence error: " + e);throw e;}};/** 执行sql** (无返回值,需要获取 数据、受影响行数、新增数据的id、等,请使用 find insert update delete )* @public* @param {string} sqlStr* @returns {void}*/SQLiteUtil.prototype.execSQL = function (sqlStr) {var db;try {db = this._getDBConnection();db.execSQL(sqlStr);}catch (e) {throw e;}finally {db && db.close();}};/** 需要升级* @public* @param {number} newVersion 版本号 数字* @returns {boolean} 如果新版本代码大于当前数据库版本,则返回true。*/SQLiteUtil.prototype.needUpgrade = function (newVersion) {var res = false;var db;try {db = this._getDBConnection();res = db.needUpgrade(newVersion);}catch (e) {this._error("needUpgrade error:" + e);throw e;}finally {db && db.close();}return res;};/** 删除数据库文件* @public*/SQLiteUtil.prototype.deleteDbFile = function () {if (files.exists(this._db_file_path)) {files.remove(this._db_file_path);this._log("数据库删除成功,地址:" + this._db_file_path);}};/** 获取 游标里的 数据** @private* @param {*} cursor 游标* @returns {object[]} json 数组*/SQLiteUtil.prototype._getCursorDataArr = function (cursor) {var res = [];if (cursor) {try {cursor.moveToFirst();this._log("cursor count: " + cursor.getCount());var columnNameArr = cursor.getColumnNames();if (cursor.getCount() > 0) {do {var resItem = {};for (var nameIndex = 0; nameIndex < columnNameArr.length; nameIndex++) {var nameItem = columnNameArr[nameIndex];var columnIndex = cursor.getColumnIndex(nameItem);if (columnIndex > -1) {var itemValue = void 0;switch (cursor.getType(columnIndex)) {case 0: // FIELD_TYPE_NULL 0itemValue = null;break;case 1: // FIELD_TYPE_INTEGER 1itemValue = cursor.getInt(columnIndex);break;case 2: // FIELD_TYPE_FLOAT 2itemValue = cursor.getFloat(columnIndex);break;case 3: // FIELD_TYPE_STRING 3itemValue = cursor.getString(columnIndex);break;case 4: // FIELD_TYPE_BLOB 4itemValue = cursor.getBlob(columnIndex);break;default:itemValue = cursor.getString(columnIndex);break;}resItem[nameItem] = itemValue;}}res.push(resItem);} while (cursor.moveToNext());}}catch (e) {this._error("_getCursorDataArr error: " + e);throw e;}finally {cursor.close();}}return res;};/** 获取 contentValues ( json 转 contentValues )** @private* @param {object} jsonObj json对象* @returns ContentValues 对象*/SQLiteUtil.prototype._getContentValues = function (jsonObj) {// @ts-ignorevar cv = new ContentValues();if (jsonObj) {for (var key in jsonObj) {var item = jsonObj[key];switch (typeof item) {case "number":cv.put(key, java.lang.Integer(item));break;case "boolean":cv.put(key, java.lang.Boolean(item));break;case "boolean":cv.put(key, java.lang.Boolean(item));break;default:cv.put(key, java.lang.String(item));break;}}}/**void put(java.lang.String,java.lang.Long)void put(java.lang.String,java.lang.Byte)void put(java.lang.String,java.lang.Double)void put(java.lang.String,java.lang.Float)void put(java.lang.String,java.lang.Integer)void put(java.lang.String,java.lang.Short)*/return cv;};/** log 日志** @private* @param {*} msg*/SQLiteUtil.prototype._log = function () {var data = [];for (var _i = 0; _i < arguments.length; _i++) {data[_i] = arguments[_i];}// 注释后,可以去掉所有的 log 输出var msg = [];for (var i = 0; i < arguments.length; i++) {var item = arguments[i];msg.push(item);}console.log(msg.join(" "));};/** error 日志** @private* @param {any} msg*/SQLiteUtil.prototype._error = function (msg) {console.error(msg);};/** 获取 db连接对象** @private*/SQLiteUtil.prototype._getDBConnection = function () {// @ts-ignorereturn SQLiteDatabase.openOrCreateDatabase(this._db_file_path, null);};return SQLiteUtil;
}());
相关文章:
Autojs: 使用 SQLite
例子 let db new SQLiteUtil("/sdcard/A_My_DB/sqlite.db");db.fastCreateTable("user_table",{name: "",online: false,},["name"] // 设置 name 为唯一, 重复项 不会添加成功 );// 新增数据的 ID let row_id db.insert("use…...
思科、华为、H3C常用命令对照表
取消/关闭 思科no华为undo华三undo 查看 思科show华为display华三display 退出 思科exit华为quit华三quit 设备命名 思科hostname华为sysname华三sysname 进入全局模式 思科enable、config terminal华为system-view华三system-view 删除文件 思科delete华为delete华…...

解决 `pip is configured with locations that require TLS/SSL` 错误
问题描述 在使用 pip 安装 Python 包时,可能会遇到以下错误: WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.这意味着 Python 的 ssl 模块未正确安装或配置,导致 p…...

2025-arXiv-OmniThink:通过思考扩展机器写作的知识边界
arXiv | https://arxiv.org/abs/2501.09751 GitHub | https://github.com/zjunlp/OmniThink 项目主页 | https://zjunlp.github.io/project/OmniThink/ ModelScope 在线 Demo | https://www.modelscope.cn/studios/iic/OmniThink 摘要: 大语言模型驱动的机器写作通…...

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)
第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网:http://www.icetae.com/【更多详情】 会议时间:2025年4月25-27日 会议地点:…...

机器学习:01数学基础教程
函数 极限 按照一定次数排列的一列数:“,“,…,"…,其中u 叫做通项。 对于数列{Un}如果当n无限增大时,其通项无限接近于一个常数A,则称该数列以A为极限或称数列收敛于A,否则称数列为发散, 极限值 左…...

仿叮咚买菜鸿蒙原生APP
# DingdongShopping 这是一个原生鸿蒙版的仿叮咚买菜APP项目 鸿蒙Next发布至今已经有一年多的时间了,但有时候我们想要实现一些复杂的功能或者效果,在开发文档上查阅一些资料还是比较费时的,有可能还找不到我们想要的内容。而社会层面上分享…...

WordPress“更新失败,响应不是有效的JSON响应”问题的修复
在使用WordPress搭建网站时,许多人在编辑或更新文章时,可能会遇到一个提示框,显示“更新失败,响应不是有效的JSON响应”。这个提示信息对于不了解技术细节的用户来说,太难懂。其实,这个问题并不复杂&#x…...
kotlin的onFailure: () -> Unit
在Kotlin中,onFailure: () -> Unit表示一个没有参数且返回类型为Unit的函数。 在Kotlin中,Unit类型用于表示那些没有返回值的函数。具体来说,() -> Unit表示一个没有参数的函数,其返回类型为Unit。这种函数通常用于表示…...

通过网线将Keysight DSOX4154A示波器信号传输至电脑的Step
一、硬件连接 连接网线 使用标准以太网线(Cat5e或更高)连接示波器背面的 LAN端口 至电脑或同一局域网的交换机/路由器。 二、示波器网络配置 进入网络设置菜单 点击示波器前面板右上角 【Utility】 → 【I/O】 → 【LAN Settings】。 配置IP地址 自…...

midjourney 一 prompt 提示词
midjourney 不需要自然语言的描述,它只需要关键词即可。 一个完整的Midjourney prompt通常包括三个部分 图片提示(Image Prompts)、文本提示(Text Prompt)和参数(Parameters)。 1、图片提示(…...
微信小程序 - 网络请求基础路径集中管理(基础路径集中管理策略、动态切换基础路径)
一、基础路径集中管理 在微信小程序项目开发中,经常会将请求的基础路径集中管理 这样可以避免在多个页面中重复定义,同时也方便后续维护与修改 二、基础路径集中管理策略 1、使用全局变量 微信小程序提供了 App 对象,可以在 app.js 中定义…...
C#的委托delegate与事件event
在C#中,delegate(委托)和 event(事件)是两个非常重要的概念,它们主要用于实现回调机制和事件驱动编程。下面详细介绍它们的原理和使用场景。 1. Delegate(委托) 1.1 委托的原理 委托…...
apache artemis安装
安装apache artemis https://xxzkid.github.io/2025/apache-artemis-install...

Lightning基础训练尝试实例
一、训练任务概述 动机:由于后续的课题中会用到类似图像去噪的算法,考虑先用U-Net,这里做一个前置的尝试。 训练任务:分割出图像中的细胞。 数据集:可私 数据集结构: 二、具体实现 U-Net的网络实现是现…...
osgearth视点坐标及鼠标交点坐标的信息显示(七)
核心函数如下: void COSGObject::addViewPointLabel() {//mRoot->addChild(osgEarth::Util::Controls::ControlCanvas::get(mViewer));//放开这句,球就卡住了。 为什么,shitosgEarth::Util::Controls::ControlCanvas* canvas = osgEarth::Util::Controls::ControlCanvas…...

动态规划 之 背包问题
文章目录 0-1背包问题2915.和为目标值的最长子序列的长度494.目标和 完全背包问题322.零钱兑换518.零钱兑换II 多重背包2585.获得分数的方法数 分组背包1155.掷骰子等于目标和的方法数 背包问题是动态规划一个很重要的一类题目,主要分为0-1背包问题以及完全背包问题…...

【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (10) – UC 使用 前言 由于ADB 的更新速度很快,在几个月之后重新搭建ADB 时发现UC 已经更新了很多,为了后续做ADB 的功…...
RTMP(Real-Time Messaging Protocol)
RTMP(Real-Time Messaging Protocol)是一种用于实时音视频和数据传输的协议,常见于直播和流媒体应用。 一 RTSP 协商消息 一、消息类型(Message Types) RTMP消息分为多种类型,通过Message Type ID标识&a…...

docker容器部署jar应用导入文件时候报缺少字体错误解决
如题,在导入文件时候报错如下: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager 经查是缺少对应字体,解决办法有两张: 第一种:…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

QT开发技术【ffmpeg + QAudioOutput】音乐播放器
一、 介绍 使用ffmpeg 4.2.2 在数字化浪潮席卷全球的当下,音视频内容犹如璀璨繁星,点亮了人们的生活与工作。从短视频平台上令人捧腹的搞笑视频,到在线课堂中知识渊博的专家授课,再到影视平台上扣人心弦的高清大片,音…...
Python的__call__ 方法
在 Python 中,__call__ 是一个特殊的魔术方法(magic method),它允许一个类的实例像函数一样被调用。当你在一个对象后面加上 () 并执行时(例如 obj()),Python 会自动调用该对象的 __call__ 方法…...
Docker、Wsl 打包迁移环境
电脑需要开启wsl2 可以使用wsl -v 查看当前的版本 wsl -v WSL 版本: 2.2.4.0 内核版本: 5.15.153.1-2 WSLg 版本: 1.0.61 MSRDC 版本: 1.2.5326 Direct3D 版本: 1.611.1-81528511 DXCore 版本: 10.0.2609…...

简约商务通用宣传年终总结12套PPT模版分享
IOS风格企业宣传PPT模版,年终工作总结PPT模版,简约精致扁平化商务通用动画PPT模版,素雅商务PPT模版 简约商务通用宣传年终总结12套PPT模版分享:商务通用年终总结类PPT模版https://pan.quark.cn/s/ece1e252d7df...

SQLSERVER-DB操作记录
在SQL Server中,将查询结果放入一张新表可以通过几种方法实现。 方法1:使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构(包括列名和数据类型)将与查询结果匹配。 SELECT * INTO 新…...