当前位置: 首页 > news >正文

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 包时&#xff0c;可能会遇到以下错误&#xff1a; WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.这意味着 Python 的 ssl 模块未正确安装或配置&#xff0c;导致 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 摘要&#xff1a; 大语言模型驱动的机器写作通…...

【广州大学主办,发表有保障 | IEEE出版,稳定EI检索,往届见刊后快至1个月检索】第二届电气技术与自动化工程国际学术会议 (ETAE 2025)

第二届电气技术与自动化工程国际学术会议 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大会官网&#xff1a;http://www.icetae.com/【更多详情】 会议时间&#xff1a;2025年4月25-27日 会议地点&#xff1a…...

机器学习:01数学基础教程

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

仿叮咚买菜鸿蒙原生APP

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

WordPress“更新失败,响应不是有效的JSON响应”问题的修复

在使用WordPress搭建网站时&#xff0c;许多人在编辑或更新文章时&#xff0c;可能会遇到一个提示框&#xff0c;显示“更新失败&#xff0c;响应不是有效的JSON响应”。这个提示信息对于不了解技术细节的用户来说&#xff0c;太难懂。其实&#xff0c;这个问题并不复杂&#x…...

kotlin的onFailure: () -> Unit

‌在Kotlin中&#xff0c;onFailure: () -> Unit表示一个没有参数且返回类型为Unit的函数。‌ 在Kotlin中&#xff0c;Unit类型用于表示那些没有返回值的函数。具体来说&#xff0c;() -> Unit表示一个没有参数的函数&#xff0c;其返回类型为Unit。这种函数通常用于表示…...

通过网线将Keysight DSOX4154A示波器信号传输至电脑的Step

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

midjourney 一 prompt 提示词

midjourney 不需要自然语言的描述&#xff0c;它只需要关键词即可。 一个完整的Midjourney prompt通常包括三个部分 图片提示&#xff08;Image Prompts&#xff09;、文本提示&#xff08;Text Prompt&#xff09;和参数&#xff08;Parameters&#xff09;。 1、图片提示(…...

微信小程序 - 网络请求基础路径集中管理(基础路径集中管理策略、动态切换基础路径)

一、基础路径集中管理 在微信小程序项目开发中&#xff0c;经常会将请求的基础路径集中管理 这样可以避免在多个页面中重复定义&#xff0c;同时也方便后续维护与修改 二、基础路径集中管理策略 1、使用全局变量 微信小程序提供了 App 对象&#xff0c;可以在 app.js 中定义…...

C#的委托delegate与事件event

在C#中&#xff0c;delegate&#xff08;委托&#xff09;和 event&#xff08;事件&#xff09;是两个非常重要的概念&#xff0c;它们主要用于实现回调机制和事件驱动编程。下面详细介绍它们的原理和使用场景。 1. Delegate&#xff08;委托&#xff09; 1.1 委托的原理 委托…...

apache artemis安装

安装apache artemis https://xxzkid.github.io/2025/apache-artemis-install...

Lightning基础训练尝试实例

一、训练任务概述 动机&#xff1a;由于后续的课题中会用到类似图像去噪的算法&#xff0c;考虑先用U-Net&#xff0c;这里做一个前置的尝试。 训练任务&#xff1a;分割出图像中的细胞。 数据集&#xff1a;可私 数据集结构&#xff1a; 二、具体实现 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.掷骰子等于目标和的方法数 背包问题是动态规划一个很重要的一类题目&#xff0c;主要分为0-1背包问题以及完全背包问题…...

【Azure 架构师学习笔记】- Azure Databricks (11) -- UC搭建

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (10) – UC 使用 前言 由于ADB 的更新速度很快&#xff0c;在几个月之后重新搭建ADB 时发现UC 已经更新了很多&#xff0c;为了后续做ADB 的功…...

RTMP(Real-Time Messaging Protocol)

RTMP&#xff08;Real-Time Messaging Protocol&#xff09;是一种用于实时音视频和数据传输的协议&#xff0c;常见于直播和流媒体应用。 一 RTSP 协商消息 一、消息类型&#xff08;Message Types&#xff09; RTMP消息分为多种类型&#xff0c;通过Message Type ID标识&a…...

docker容器部署jar应用导入文件时候报缺少字体错误解决

如题&#xff0c;在导入文件时候报错如下&#xff1a; Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: Could not initialize class sun.awt.X11FontManager 经查是缺少对应字体&#xff0c;解决办法有两张&#xff1a; 第一种&#xff1a;…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

服务器--宝塔命令

一、宝塔面板安装命令 ⚠️ 必须使用 root 用户 或 sudo 权限执行&#xff01; sudo su - 1. CentOS 系统&#xff1a; yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh2. Ubuntu / Debian 系统…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

PH热榜 | 2025-06-08

1. Thiings 标语&#xff1a;一套超过1900个免费AI生成的3D图标集合 介绍&#xff1a;Thiings是一个不断扩展的免费AI生成3D图标库&#xff0c;目前已有超过1900个图标。你可以按照主题浏览&#xff0c;生成自己的图标&#xff0c;或者下载整个图标集。所有图标都可以在个人或…...

[拓扑优化] 1.概述

常见的拓扑优化方法有&#xff1a;均匀化法、变密度法、渐进结构优化法、水平集法、移动可变形组件法等。 常见的数值计算方法有&#xff1a;有限元法、有限差分法、边界元法、离散元法、无网格法、扩展有限元法、等几何分析等。 将上述数值计算方法与拓扑优化方法结合&#…...

CppCon 2015 学习:Reactive Stream Processing in Industrial IoT using DDS and Rx

“Reactive Stream Processing in Industrial IoT using DDS and Rx” 是指在工业物联网&#xff08;IIoT&#xff09;场景中&#xff0c;结合 DDS&#xff08;Data Distribution Service&#xff09; 和 Rx&#xff08;Reactive Extensions&#xff09; 技术&#xff0c;实现 …...

五、jmeter脚本参数化

目录 1、脚本参数化 1.1 用户定义的变量 1.1.1 添加及引用方式 1.1.2 测试得出用户定义变量的特点 1.2 用户参数 1.2.1 概念 1.2.2 位置不同效果不同 1.2.3、用户参数的勾选框 - 每次迭代更新一次 总结用户定义的变量、用户参数 1.3 csv数据文件参数化 1、脚本参数化 …...