Files
douyin-robot-autojs/core.sqlite.js
2024-09-30 10:59:36 +08:00

418 lines
11 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 导入必要的class
importClass(android.database.sqlite.SQLiteDatabase);
importClass(android.content.ContentValues);
function SQLiteSDK(filePath) {
this._dbFilePath = filePath;
}
/** 根据 json 键值 快速建表
* @public
* @param {*} tableName 表名
* @param {*} data json数据
* @param {*} uniqueArr 唯一
*/
SQLiteSDK.prototype.fastCreateTable = function (tableName, data, uniqueArr) {
let columnArr = [];
let itemName = "";
// 拼接数据类型
for (let key in data) {
//_log((typeof data[key]) + data[key])
switch (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.indexOf(key) > -1) {
itemName += " unique";
}
columnArr.push(itemName);
}
// 创建
this.createTable(tableName, columnArr);
};
/** 创建表
* @public
* @param {string} tableName 表名
* @param {string[]} columns 参数列名 数组, 源码中会用 逗号隔开
*/
SQLiteSDK.prototype.createTable = function (tableName, columns) {
this._log("init");
try {
files.ensureDir(this._dbFilePath);
this.execSQL("create table IF NOt EXISTS " + tableName + "(id integer primary key autoincrement," + columns.join(",") + ")");
} catch (e) {
this._error("createTable error: " + e);
}
};
/** 查询
* @public
* @example
* db.find("select * from " + tableName + " where weibo_UserName='13235919724'");
* @param {string} sqlStr sql字符串
* @returns {object[]} json 数组
*/
SQLiteSDK.prototype.find = function (sqlStr) {
this._log("find");
let res = [];
let db;
try {
db = this._getDBConnection();
res = this._getCursorDataArr(db.rawQuery(sqlStr, null));
} catch (e) {
this._error("find error: " + e);
} finally {
db ? db.close() : "";
}
return res;
};
/** 插入
*
* @public
* @param {表明} tableName 表明
* @param {object} jsonObj json数据对象
* @param {string?} nullColumnHack 可以不传,一般为null即可 https://www.iteye.com/blog/mofan-1412262
* @returns {number} 插入的行ID如果发生错误则返回-1
*/
SQLiteSDK.prototype.insert = function (tableName, jsonObj, nullColumnHack) {
this._log("insert");
nullColumnHack = nullColumnHack || null;
let res = -1;
let db;
try {
db = this._getDBConnection();
db.beginTransaction();
res = db.insert(tableName, nullColumnHack, this._getContentValues(jsonObj));
db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交。
} catch (e) {
this._error("insert error: " + e);
} finally {
db ? db.endTransaction() : "";
db ? db.close() : "";
}
return res;
};
/** 删除
* @public
* @example
* db.delete(tableName,"weibo_UserName=?",["1名字"])
* @param {string} tableName 表名
* @param {string} whereClause where 条件
* @param {string[]} whereArgs where 条件的参数
* @returns {number} 如果传入whereClause则受影响的行数否则为0 。要删除所有行并获得计数请将“1”作为 whereClause。
*/
SQLiteSDK.prototype.delete = function (tableName, whereClause, whereArgs) {
this._log("delete");
let res = 0;
let db;
try {
db = this._getDBConnection();
db.beginTransaction();
res = db.delete(tableName, whereClause, whereArgs);
db.setTransactionSuccessful(); //设置事务处理成功,不设置会自动回滚不提交。
} catch (e) {
this._error("delete error: " + e);
} finally {
db ? db.endTransaction() : "";
db ? db.close() : "";
}
return res;
};
/** 更新
* @public
* @example
* db.update(tableName,{"weibo_NickName":"哈哈哈"},"weibo_UserName=?",["13235919724"])
* @param {string} tableName 表名
* @param {object} jsonObj json对象
* @param {string} whereClause where 条件
* @param {string[]} whereArgs where 条件的参数
* @returns {number} 受影响的行数
*/
SQLiteSDK.prototype.update = function (tableName, jsonObj, whereClause, whereArgs) {
this._log("update");
let res = 0;
let db;
try {
db = this._getDBConnection();
res = db.update(tableName, this._getContentValues(jsonObj), whereClause, whereArgs);
} catch (e) {
this._error("update error: " + 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
*/
SQLiteSDK.prototype.replace = function (tableName, jsonObj, nullColumnHack) {
nullColumnHack = nullColumnHack || null;
let res = -1;
let db;
try {
db = this._getDBConnection();
res = db.replace(tableName, nullColumnHack, this._getContentValues(jsonObj));
} catch (e) {
this._error("replace error: " + e);
} finally {
db ? db.close() : "";
}
return res;
};
/** 删除表
* @public
* @param {string} tableName 表名
*/
SQLiteSDK.prototype.dropTable = function (tableName) {
try {
this.execSQL("drop table if exists " + tableName);
} catch (e) {
this._error("dropTable error: " + e);
}
};
/** 清空表
* @public
* @param {string} tableName 表名
*/
SQLiteSDK.prototype.clearTable = function (tableName) {
try {
this.execSQL("delete from " + tableName);
} catch (e) {
this._error("clearTable error: " + e);
}
};
/** 表索引序列归0
* @public
* @param {string} tableName 表名
*/
SQLiteSDK.prototype.resetTableSequence = function (tableName) {
try {
db.execSQL("UPDATE sqlite_sequence SET seq = 0 WHERE name = '" + tableName + "'");
} catch (e) {
this._error("resetTableSequence error: " + e);
}
};
/** 执行sql
* @public
* @param {string} sqlStr
*/
SQLiteSDK.prototype.execSQL = function (sqlStr) {
let db;
try {
db = this._getDBConnection();
db.execSQL(sqlStr);
} catch (e) {
throw e;
} finally {
db ? db.close() : "";
}
};
/** 需要升级
* @public
* @param {number} newVersion 版本号 数字
* @returns {boolean} 如果新版本代码大于当前数据库版本则返回true。
*/
SQLiteSDK.prototype.needUpgrade = function (newVersion) {
let res = false;
let db;
try {
db = this._getDBConnection();
res = db.needUpgrade(newVersion);
} catch (e) {
this._error("needUpgrade error:" + e);
} finally {
db ? db.close() : "";
}
return res;
};
/** 删除数据库文件
* @public
*/
SQLiteSDK.prototype.deleteDbFile = function () {
if (files.exists(this._dbFilePath)) {
files.remove(this._dbFilePath);
this._log("数据库删除成功,地址:" + this._dbFilePath);
}
};
//#region 私有方法
/** 获取 游标里的 数据
*
* @private
* @param {string} cursor 游标
* @returns {object[]} json 数组
*/
SQLiteSDK.prototype._getCursorDataArr = function (cursor) {
let res = [];
if (cursor) {
try {
cursor.moveToFirst();
this._log("cursor count: " + cursor.getCount());
let columnNameArr = cursor.getColumnNames();
if (cursor.getCount() > 0) {
do {
let resItem = {};
for (let nameIndex = 0; nameIndex < columnNameArr.length; nameIndex++) {
let nameItem = columnNameArr[nameIndex];
let columnIndex = cursor.getColumnIndex(nameItem);
if (columnIndex > -1) {
let itemValue;
switch (cursor.getType(columnIndex)) {
case 0: // FIELD_TYPE_NULL 0
itemValue = null;
break;
case 1: // FIELD_TYPE_INTEGER 1
itemValue = cursor.getInt(columnIndex);
break;
case 2: // FIELD_TYPE_FLOAT 2
itemValue = cursor.getFloat(columnIndex);
break;
case 3: // FIELD_TYPE_STRING 3
itemValue = cursor.getString(columnIndex);
break;
case 4: // FIELD_TYPE_BLOB 4
itemValue = 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);
} finally {
cursor.close();
}
}
return res;
};
/** 获取 contentValues -------- (json转 contentValues)
*
* @private
* @param {object} jsonObj json对象
* @returns ContentValues对象
*/
SQLiteSDK.prototype._getContentValues = function (jsonObj) {
let cv = new ContentValues();
if (jsonObj) {
for (let key in jsonObj) {
let 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
*/
SQLiteSDK.prototype._log = function (msg) {
// console.log(msg);
};
/** error日志
*
* @private
* @param {any} msg
*/
SQLiteSDK.prototype._error = function (msg) {
console.error(msg);
};
/** 获取 db连接对象
*
* @private
*/
SQLiteSDK.prototype._getDBConnection = function () {
return SQLiteDatabase.openOrCreateDatabase(this._dbFilePath, null);
};
let db = new SQLiteSDK(files.path("./data.db"))
db.createTable("friends", [
"name TEXT not null default ''",
"created_at INTEGER not null default 0",
])
let addUser = function (name) {
if (existsUser(name)) {
log(`insert failed, user "${name}" exists`)
return false
}
return db.insert("friends", { name: name, created_at: Math.floor(new Date().getTime() / 1000) })
}
let existsUser = function (name) {
let result = db.find(`select count(*) as cnt from friends where name='${name}' limit 1`)
return result[0].cnt > 0
}
module.exports = {
addUser,
existsUser,
}