Initial commit

This commit is contained in:
2026-03-16 10:37:46 +08:00
commit c052a67816
508 changed files with 22987 additions and 0 deletions

View File

@@ -0,0 +1,3 @@
{
"minSdkVersion": "21"
}

View File

@@ -0,0 +1,178 @@
import Cursor from 'android.database.Cursor';
import SQLiteDatabase from 'android.database.sqlite.SQLiteDatabase';
import SQLiteOpenHelper from 'android.database.sqlite.SQLiteOpenHelper';
import { createSQLiteContextOptions, executeSqlOptions, selectSqlOptions, executeSqlOptionsResult, selectSqlOptionsResult, transactionOptions,transactionResult } from '../interface.uts';
class SQLiteContext extends SQLiteOpenHelper {
private databaseName: string | null;
constructor(name: string) {
super(UTSAndroid.getAppContext()!, name, null, 1);
this.databaseName = name;
}
public executeSql(options: executeSqlOptions): void {
const database: SQLiteDatabase = this.getReadableDatabase();
const SqlArray = options.sql.split(';');
let result: executeSqlOptionsResult = {
data: [] as boolean[],
errMsg: 'executeSql:ok',
errCode: 0,
errSubject: '',
cause: null
}
try {
for (let i = 0; i < SqlArray.length; i++) {
if (SqlArray[i].length > 0) {
const sql = SqlArray[i].replace(/^\s+/, '');
try {
database.execSQL(sql);
result.data.push(true);
} catch (err) {
console.error('database.execSQL 出错:', err, 'SQL:', sql);
result.data.push(false);
// 立即调用 fail 并返回
result.errMsg = 'executeSql:fail';
result.errCode = 1000002;
result.cause = err;
options.fail?.(result);
options.complete?.(result);
return;
}
}
}
options.success?.(result);
} catch (e) {
console.error('executeSql 外层出错:', e);
const data = result.data;
result = {
errCode: 1000002,
errMsg: 'executeSql:fail',
errSubject: '',
cause: e,
data: data
};
options.fail?.(result);
}
options.complete?.(result);
}
public selectSql(options: selectSqlOptions): void {
const database: SQLiteDatabase = this.getReadableDatabase();
const SqlArray = options.sql.split(';');
let result: selectSqlOptionsResult = {
data: [] as string[][],
errMsg: 'selectSql:ok',
errCode: 0,
errSubject: '',
cause: null
}
try {
for (let i = 0; i < SqlArray.length; i++) {
if (SqlArray[i].length > 0) {
const sql = SqlArray[i].replace(/^\s+/, '');
try {
const cursor: Cursor = database.rawQuery(sql, null);
//获取查询结果的字符串并push到result.data中
if (cursor.moveToFirst()) {
do {
const row = cursor.getColumnCount();
const rowArray = [] as string[];
for (let j = 0; j < row; j++) {
rowArray.push(cursor.getString(j.toInt()));
}
result.data.push(rowArray);
} while (cursor.moveToNext());
}
cursor.close();
} catch {
result.data.push([] as string[]);
}
}
}
options.success?.(result);
} catch (e) {
const data = result.data;
result = {
errCode: 1000003,
errMsg: 'selectSql:fail',
errSubject: '',
cause: e,
data: data
};
options.fail?.(result);
}
options.complete?.(result);
}
public transaction(options: transactionOptions): void {
const database: SQLiteDatabase = this.getReadableDatabase();
const transaction = options.transaction;
let result: transactionResult = {
errMsg: 'transaction:ok',
errCode: 0,
errSubject: '',
cause: null
};
try {
if (transaction == 'begin') {
database.execSQL('BEGIN TRANSACTION');
} else if (transaction == 'commit') {
database.execSQL('COMMIT');
} else if (transaction == 'rollback') {
database.execSQL('ROLLBACK');
}
options.success?.(result);
} catch (e) {
let errCode = 1000008;
if (transaction == 'begin') {
errCode = 1000004;
} else if (transaction == 'commit') {
errCode = 1000005;
} else if (transaction == 'rollback') {
errCode = 1000006;
}
result = {
errCode: errCode,
errMsg: 'transaction:fail',
errSubject: '',
cause: e
};
options.fail?.(result);
}
options.complete?.(result);
}
public override onCreate(db: SQLiteDatabase): void {
// 可选:初始化表结构
}
public override onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int): void {
// 可选:数据库升级逻辑
}
}
export const createSQLiteContext = function (options: createSQLiteContextOptions) {
const name = options.name + '.db';
return new SQLiteContext(name); // 必须返回对象
}
export type executeSqlOptionsResultType = {
errCode: number;
errSubject?: string;
cause?: any;
errMsg: string;
date?: boolean[];
};
export type selectSqlOptionsResultType = {
errCode: number;
errSubject?: string;
cause?: any;
errMsg: string;
date?: string[];
};

View File

@@ -0,0 +1,13 @@
{
"deploymentTarget": "9.0",
"dependencies-pods": [
{
"name": "FMDB",
"version": "2.7.8",
"repo": {
"git": "https://github.com/ccgus/fmdb.git",
"tag": "2.7.8"
}
}
]
}

View File

@@ -0,0 +1,116 @@
import { FMDatabase } from 'FMDB';
import { createSQLiteContextOptions, executeSqlOptions, selectSqlOptions, executeSqlOptionsResult, selectSqlOptionsResult, CreateSQLiteContext, transactionOptions } from '../interface.uts';
import { createSQLiteContextFailImpl } from '../unierror.uts';
class SQLiteContext extends FMDatabase {
private databaseName: string | null;
constructor(name: string) {
let version = 1;
const path = UTSiOS.getDataPath() + '/sqlite/' + name;
super(path);
this.databaseName = name;
}
public executeSql(options: executeSqlOptions) {
const SqlArray = options.sql.split(';');
let result: executeSqlOptionsResult = {
data: [] as boolean[],
errMsg: 'executeSql:ok',
}
try {
for (let i = 0; i < SqlArray.length; i++) {
if (SqlArray[i].length > 0) {
const sql = SqlArray[i].replace(/^\s+/, '');
try {
this.executeQuery(sql);
result.data.push(true);
} catch {
result.data.push(false);
}
}
}
options.success?.(result);
} catch (e) {
const data = result.data;
result = new createSQLiteContextFailImpl(1000002);
result.data = data;
options.fail?.(result);
}
options.complete?.(result);
return result;
}
public selectSql(options: selectSqlOptions) {
const SqlArray = options.sql.split(';');
let result: selectSqlOptionsResult = {
data: [] as boolean[],
errMsg: 'selectSql:ok',
}
try {
for (let i = 0; i < SqlArray.length; i++) {
if (SqlArray[i].length > 0) {
const sql = SqlArray[i].replace(/^\s+/, '');
try {
const cursor = this.executeQueryWithFormat(sql);
//获取查询结果的字符串并push到result.data中
while (cursor.next()) {
const row = cursor.getRow();
result.data.push(row);
}
cursor.close();
} catch {
result.data.push("");
}
}
}
options.success?.(result);
} catch (e) {
const data = result.data;
result = new createSQLiteContextFailImpl(1000003);
result.data = data;
options.fail?.(result);
}
options.complete?.(result);
return result;
}
public transaction(options: transactionOptions) {
const transaction = options.transaction;
let result: executeSqlOptionsResult = {
errMsg: 'transaction:ok',
}
try {
if (transaction == 'begin') {
//开启事务
this.beginTransaction();
} else if (transaction == 'commit') {
//提交事务
this.commit();
} else if (transaction == 'rollback') {
//回滚事务
this.rollback();
}
options.success?.(result);
} catch (e) {
let errCode = 1000008;
if (transaction == 'begin') {
errCode = 1000004;
} else if (transaction == 'commit') {
errCode = 1000005;
} else if (transaction == 'rollback') {
errCode = 1000006;
}
result = new createSQLiteContextFailImpl(errCode);
options.fail?.(result);
}
options.complete?.(result);
return result;
}
}
export const createSQLiteContext: CreateSQLiteContext = function (options: createSQLiteContextOptions) {
const name = options.name + '.db';
return new SQLiteContext(name);
}

View File

@@ -0,0 +1,153 @@
/**
* 初始化数据库时的相关配置
* @param name 数据库名称
*/
export type createSQLiteContextOptions = {
/**
* 数据库名称
*/
name: string,
}
/**
* 执行增删改等操作的SQL语句的相关配置
* @param sql SQL语句
* @param success 成功回调
* @param fail 失败回调
* @param complete 完成回调
*/
export type executeSqlOptions = {
/**
* SQL语句
*/
sql: string,
/**
* 执行增删改等操作的SQL语句的成功回调
*/
success?: executeSqlOptionsSuccessCallback | null,
/**
* 执行增删改等操作的SQL语句的失败回调
*/
fail?: executeSqlOptionsFailCallback | null,
/**
* 执行增删改等操作的SQL语句的完成回调
*/
complete?: executeSqlOptionsCompleteCallback | null,
}
/**
* 执行增删改等操作的SQL语句的成功回调
*/
export type executeSqlOptionsSuccessCallback = (res: executeSqlOptionsResult) => void
/**
* 执行增删改等操作的SQL语句的失败回调
*/
export type executeSqlOptionsFailCallback = (res: executeSqlOptionsResult) => void
/**
* 执行增删改等操作的SQL语句的完成回调
*/
export type executeSqlOptionsCompleteCallback = (res: executeSqlOptionsResult) => void
export type transactionResult = {
errCode: number;
errSubject?: string;
cause?: any;
errMsg: string;
};
export type ICreateSQLiteContextError = {
errCode: number;
errSubject?: string;
cause?: any;
errMsg: string;
};
export type executeSqlOptionsResult = {
errCode: number;
errSubject?: string;
cause?: any;
errMsg: string;
data: boolean[];
}
/**
* 执行查询操作的SQL语句的相关配置
*/
export type selectSqlOptions = {
/**
* SQL语句
*/
sql: string,
/**
* 执行查询操作的SQL语句的成功回调
*/
success?: selectSqlOptionsSuccessCallback | null,
/**
* 执行查询操作的SQL语句的失败回调
*/
fail?: selectSqlOptionsFailCallback | null,
/**
* 执行查询操作的SQL语句的完成回调
*/
complete?: selectSqlOptionsCompleteCallback | null,
}
/**
* 执行查询操作的SQL语句的成功回调
*/
export type selectSqlOptionsSuccessCallback = (res: selectSqlOptionsResult) => void
/**
* 执行查询操作的SQL语句的失败回调
*/
export type selectSqlOptionsFailCallback = (res: selectSqlOptionsResult) => void
/**
* 执行查询操作的SQL语句的完成回调
*/
export type selectSqlOptionsCompleteCallback = (res: selectSqlOptionsResult) => void
export type selectSqlOptionsResult = {
errCode: number;
errSubject?: string;
cause?: any;
errMsg: string;
data: string[][];
}
export type transactionOptions = {
transaction: transactionOperation;
success?: (res: transactionResult) => void;
fail?: (res: transactionResult) => void;
complete?: (res: transactionResult) => void;
}
/**
* 事务操作类型
* @param begin 开始事务
* @param commit 提交事务
* @param rollback 回滚事务
*/
export type transactionOperation = 'begin' | 'commit' | 'rollback'
/**
* 事务执行的成功回调
*/
export type transactionSuccessCallback = (res: transactionResult) => void
/**
* 事务执行的失败回调
*/
export type transactionFailCallback = (res: transactionResult) => void
/**
* 事务执行的完成回调
*/
export type transactionCompleteCallback = (res: transactionResult) => void

View File

@@ -0,0 +1,65 @@
import { ICreateSQLiteContextError } from "./interface.uts"
/**
* 错误主题
*/
export const UniErrorSubject = 'uni-create-sql-context';
/**
* 错误码
* @UniError
*/
export const UniErrors: Map<number, string> = new Map([
/**
* 数据库启动失败
*/
[1000001, 'Database startup failed'],
/**
* 执行SQL增删改语句失败
*/
[1000002, 'Failed to execute SQL insert, update, delete statement'],
/**
* 执行SQL查询语句失败
*/
[1000003, 'Failed to execute SQL query statement'],
/**
* 事务开始失败
*/
[1000004, 'Transaction start failed'],
/**
* 事务提交失败
*/
[1000005, 'Transaction commit failed'],
/**
* 事务回滚失败
*/
[1000006, 'Transaction rollback failed'],
/**
* 数据库关闭失败
*/
[1000007, 'Database shutdown failed'],
/**
* 未知错误
*/
[1000008, 'Unknown error'],
]);
export class createSQLiteContextFailImpl extends UniError {
override errCode: number;
override errSubject: string;
override cause?: UTSError | null;
override errMsg: string;
constructor(
errCode: number,
errMsg: string = '',
errSubject: string = '',
cause?: UTSError | null
) {
super();
this.errCode = errCode;
this.errMsg = errMsg;
this.errSubject = errSubject;
this.cause = cause ?? null;
}
}