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 经查是缺少对应字体,解决办法有两张: 第一种:…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
rnn判断string中第一次出现a的下标
# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...
动态 Web 开发技术入门篇
一、HTTP 协议核心 1.1 HTTP 基础 协议全称 :HyperText Transfer Protocol(超文本传输协议) 默认端口 :HTTP 使用 80 端口,HTTPS 使用 443 端口。 请求方法 : GET :用于获取资源,…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
Oracle11g安装包
Oracle 11g安装包 适用于windows系统,64位 下载路径 oracle 11g 安装包...
