feat: init

This commit is contained in:
Rogee
2024-09-30 10:59:36 +08:00
parent 8ce06f9a00
commit b05c9ada1b
31 changed files with 2006 additions and 0 deletions

417
core.sqlite.js Normal file
View File

@@ -0,0 +1,417 @@
// 导入必要的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,
}