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

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** 如果封装的无法满足需求,可以在你的代码中获取 db.getDBConnection(), 自己实现* @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)* @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 属性)* @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)* @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;};/** 插入** @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;};/** 删除* @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;};/** 更新* @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 索引才有意义* @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;};/** 删除表* @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;}};/** 清空表* @param {string} tableName 表名*/SQLiteUtil.prototype.clearTable = function (tableName) {try {this.execSQL("delete from " + tableName);}catch (e) {this._error("clearTable error: " + e);throw e;}};/** 表索引序列归0* @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 )* @param {string} sqlStr* @returns {void}*/SQLiteUtil.prototype.execSQL = function (sqlStr) {var db;try {db = this.getDBConnection();db.execSQL(sqlStr);}catch (e) {this._error("execSQL error: " + e);throw e;}finally {db && db.close();}};/*** 执行 sql 并获取数量** @example* select count(*) from user_table where id < 5* @param sql* @returns*/SQLiteUtil.prototype.getCount = function (sql) {var db;var cursor;try {db = this.getDBConnection();cursor = db.rawQuery(sql, null);cursor.moveToFirst();var count = cursor.getLong(0);return count;}catch (e) {this._error("getCount error: " + e);throw e;}finally {db && db.close();cursor && cursor.close();}};/** 需要升级* @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;};/** 删除数据库文件*/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 && 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…...

读书笔记 - 修改代码的艺术

读书笔记 - 修改代码的艺术 第 1 章 修改软件第 2 章 带着反馈工作系统变更方式反馈方式遗留代码修改方法 第 3 章 感知和分离伪协作程序模拟对象 第 4 章 接缝模型接缝 第 5 章 工具自动化重构工具单元测试用具 第 6 章 时间紧迫&#xff0c;但必须修改新生方法&#xff08;Sp…...

element-plus树形数据与懒加载的实现

环境 vue版本&#xff1a; 2.6.14 需求 树形表格&#xff0c;默认返回当前登录人拥有权限的一个层级的数据&#xff0c;通过点击load懒加载获取下一层的数据&#xff0c;要求有新增、编辑、删除操作。 树类型的懒加载&#xff1a; 当row中包含children字段时&#xff0c;被…...

仿 Sora 之形,借物理模拟之技绘视频之彩

来自麻省理工学院、斯坦福大学、哥伦比亚大学以及康奈尔大学的研究人员携手开源了一款创新的3D交互视频模型——PhysDreamer&#xff08;以下简称“PD”&#xff09;。PD与OpenAI旗下的Sora相似&#xff0c;能够借助物理模拟技术来生成视频&#xff0c;这意味着PD所生成的视频蕴…...

【算法】快排

题目 快排 思路 如果输入为0或1直接返回&#xff1b;否则取一个基准值&#xff0c;可以取中间位置&#xff0c;如果输入是有序的可以避免时间过长&#xff0c;然后移动指针&#xff0c;先让i指针右移&#xff0c;如果小于基准值就继续右移&#xff0c;j指针左移同理。如果指…...

RedisTemplate存储含有特殊字符解决

ERROR信息: 案发时间: 2025-02-18 01:01 案发现场: UserServiceImpl.java 嫌疑人: stringRedisTemplate.opsForValue().set(SystemConstants.LOGIN_CODE_PREFIX phone, code, Duration.ofMinutes(3L)); // 3分钟过期作案动机: stringRedisTemplate继承了Redistemplate 使用的…...

Django REST Framework (DRF) 中用于构建 API 视图类解析

Django REST Framework (DRF) 提供了丰富的视图类&#xff0c;用于构建 API 视图。这些视图类可以分为以下几类&#xff1a; 1. 基础视图类 这些是 DRF 中最基础的视图类&#xff0c;通常用于实现自定义逻辑。 常用类 APIView&#xff1a; 最基本的视图类&#xff0c;所有其…...

Zotero PDF Translate插件配置百度翻译api

Zotero PDF Translate插件可以使用几种翻译api&#xff0c;虽然谷歌最好用&#xff0c;但是由于众所周知的原因&#xff0c;不稳定。而cnki有字数限制&#xff0c;有道有时也不行。其他的翻译需要申请密钥。本文以百度为例&#xff0c;进行申请 官方有申请教程&#xff1a; Zot…...

Redis离线安装

Linux系统Centos安装部署Redis缓存插件 参考&#xff1a;Redis中文网&#xff1a; https://www.redis.net.cn/ 参考&#xff1a;RPM软件包下载地址&#xff1a; https://rpmfind.net/linux/RPM/index.html http://rpm.pbone.net/ https://mirrors.aliyun.com/centos/7/os…...

五、k8s:容忍 存储卷

容忍&#xff1a; 即使节点上有污点&#xff0c;依然可以部署pod。 tolerations: operator: "Exists" 不指定key&#xff0c;表示容忍所有的污点 cordon和drain cordon: 直接标记节点为不可用&#xff0c;pod不能部署到该节点。新建的pod不会再部署到该节点&#…...

零售顶流三只松鼠如何重塑品牌营销新生态,寻找新的增长点?

在零售行业的变革浪潮中&#xff0c;三只松鼠作为休闲零食领域的代表品牌&#xff0c;面临着前所未有的机遇与挑战。在竞争激烈的零售市场中&#xff0c;三只松鼠以其突出的表现成为行业焦点。2024 年前三季度&#xff0c;营收 71.69 亿元&#xff0c;同比增长 56.46%&#xff…...

USC 安防平台之移动侦测

随着第四次科技革命的开启&#xff0c;AI技术获取了突飞猛进的发展&#xff0c;视频监控对应的视频分析技术也获取了巨大的发展。 还记得15年前采用人工提取特征做前景背景分离和提取&#xff0c;大部分依赖CPU&#xff0c;最多使用一下TI的DM642 DSP加速&#xff0c;开发难度…...

MySQL智障离谱问题,删了库确还存在、也不能再创建同名库

1、问题 今天跟后端朋友接毕设单子的时候&#xff0c;后端穿过来的【weather.sql】这个文件没弄好&#xff0c;导致这个【weather】数据库的数据是错的&#xff0c;因此我用datagrip的GUI界面直接右键删除&#xff0c;结果就是tmd删不掉&#xff0c;ok&#xff0c;我只能在那新…...

IIS asp.net权限不足

检查应用程序池的权限 IIS 应用程序池默认使用一个低权限账户&#xff08;如 IIS_IUSRS&#xff09;&#xff0c;这可能导致无法删除某些文件或目录。可以通过以下方式提升权限&#xff1a; 方法 1&#xff1a;修改应用程序池的标识 打开 IIS 管理器。 在左侧导航树中&#x…...

pptx文档提取信息

目录 一、前言二、python-pptx提取核心代码三、LibreOffice 转换pdf再提取的核心代码一、前言 pptx文档提取解析常用的库。 如果只需要解析 .pptx 的文本、表格、图片,推荐使用 python-pptx(开源,轻量级)。 如果需要高性能、支持 .ppt、动画、格式转换,推荐 Aspose.Slid…...

深入理解Python字典(Dictionary):从基础操作到高级应用

深入理解Python字典&#xff08;Dictionary&#xff09;&#xff1a;从基础操作到高级应用 flyfish 一、Python 字典&#xff08;Dictionary&#xff09;基本概念 1. 定义 Python 字典是一种可变、无序的数据结构&#xff0c;用于存储键值对&#xff08;key - value pairs&…...

@RestController和@RequestBody注解含义

一、RestController &#xff08;一&#xff09;含义 RestController 是 Spring Framework 中的一个组合注解&#xff0c;主要用于简化创建 RESTful Web 服务的过程。 它结合了 Controller 和 ResponseBody 注解的功能&#xff0c;使得开发者可以更简洁地编写处理 HTTP 请求的…...

用deepseek学大模型04-模型可视化与数据可视化

deepseek.com: pytorch可视化工具 生成神经网络图 在 PyTorch 中&#xff0c;可视化神经网络结构的常用工具和方法有以下几种&#xff0c;以下将详细介绍它们的用法&#xff1a; 1. TensorBoard (PyTorch 官方集成) PyTorch 通过 torch.utils.tensorboard 支持 TensorBoard&a…...

C++ 设计模式-外观模式

外观模式的定义 外观模式是一种 结构型设计模式,它通过提供一个简化的接口来隐藏系统的复杂性。外观模式的核心思想是: 封装复杂子系统:将多个复杂的子系统或组件封装在一个统一的接口后面。提供简单接口:为客户端提供一个更简单、更易用的接口,而不需要客户端直接与复杂…...

设计模式-结构型-享元模式

1. 享元模式概述 享元模式&#xff08;Flyweight Pattern&#xff09;是一种结构型设计模式&#xff0c;主要用于减少对象的数量&#xff0c;以降低内存占用和提高性能。它通过共享相似对象来避免创建大量相同的实例&#xff0c;适用于需要大量创建重复对象的场景&#xff0c;…...

嵌入式八股文(四)计算机网络篇

第一章 基础概念 1. 服务 指网络中各层为紧邻的上层提供的功能调用,是垂直的。包括面向连接服务、无连接服务、可靠服务、不可靠服务。 2. 协议 是计算机⽹络相互通信的对等层实体之间交换信息时必须遵守的规则或约定的集合。⽹络协议的三个基本要素:语法、…...

用deepseek学大模型04-机器学习建模过程

https://metaso.cn/s/7tEmBHr 目前已经学完深度学习的数学基础&#xff0c;给出机器学习建模的基本过程 好的&#xff0c;我现在需要回答用户的问题&#xff1a;已经学完深度学习的数学基础&#xff0c;现在要给出机器学习建模的基本过程。我需要结合我搜索到的资料来构建一个详…...

基于单片机的多功能门铃控制系统设计(论文+源码)

1功能设计 本课题为基于单片机的多功能门铃控制系统设计&#xff0c;主要结合单片机技术&#xff0c;门铃控制技术进行设计&#xff0c;在多功能门铃控制系统的设计中&#xff0c;将其主要的设计功能确定如下&#xff1a; &#xff08;1&#xff09;可以实现门铃的基础功能…...

使用Keras构建图像分类模型的入门指南

本人主页:机器学习司猫白 机器学习专栏:机器学习实战 PyTorch入门专栏:PyTorch入门 深度学习实战:深度学习 ok,话不多说,我们进入正题吧 一、Keras框架简介 1.1 什么是Keras? Keras是一个高层神经网络API,最初由Google工程师Franois Chollet开发,具有以下核心特点:…...

docker 运行 芋道微服务

jar包打包命令 mvn clean install package -Dmaven.test.skiptrue创建文件夹 docker-ai 文件夹下放入需要jar包的文件夹及 docker-compose.yml 文件 docker-compose.yml 内容&#xff1a;我这里的是ai服务&#xff0c;所以将原先的文件内容做了变更&#xff0c;你们需要用到什…...

win10 系统 自定义Ollama安装路径 及模型下载位置

win10 系统 自定义Ollama安装路径 及模型下载位置 由于Ollama的exe安装软件双击安装的时候默认是在C盘&#xff0c;以及后续的模型数据下载也在C盘&#xff0c;导致会占用C盘空间&#xff0c;所以这里单独写了一个自定义安装Ollama安装目录的教程。 Ollama官网地址&#xff1…...

整合Salesmart/WhatsApp、开源Odoo模块和Deepseek AI能力,实现针对国外客户的智能客服和个性化推荐服务

一、项目背景 本文提出了一套针对软管制造公司的智能客服与个性化推荐系统实施方案&#xff0c;旨在通过整合开源Odoo模块、Salesmart/WhatsApp以及Deepseek AI能力&#xff0c;打造一个724小时不间断服务的智能化平台&#xff0c;专注于服务国外客户。方案围绕实现不间断服务…...

人工智能基础之数学基础:01高等数学基础

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

sourcetree gitee 详细使用

SSH 公钥设置 | Gitee 帮助中心 先配置公钥&#xff0c;输入gitee密码完成验证 gitee仓库创建完成 打开sourcetree 如果你本地有项目&#xff08;vite &#xff09;需要 git init 在设置中完成远程仓库的添加 &#xff08;ssh ,https) 直接提交推送&#xff0c;完成后&#xf…...

应急响应(linux 篇,以centos 7为例)

一、基础命令 1.查看已经登录的用户w 2.查看所有用户最近一次登录&#xff1a;lastlog 3.查看历史上登录的用户还有登录失败的用户 历史上所有登录成功的记录 last /var/log/wtmp 历史上所有登录失败的记录 Lastb /var/log/btmp 4.SSH登录日志 查看所有日志&#xff1a;…...