index.uts 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. import Cursor from 'android.database.Cursor';
  2. import SQLiteDatabase from 'android.database.sqlite.SQLiteDatabase';
  3. import SQLiteOpenHelper from 'android.database.sqlite.SQLiteOpenHelper';
  4. import Environment from 'android.os.Environment';
  5. import { createSQLiteContextOptions, executeSqlOptions, selectSqlOptions, executeSqlOptionsResult, selectSqlOptionsResult, CreateSQLiteContext, transactionOptions, transactionResult, ICreateSQLiteContextError } from '../interface.uts';
  6. //import { createSQLiteContextOptions, executeSqlOptions, selectSqlOptions, transactionOptions } from '../interface.uts';
  7. import { createSQLiteContextFailImpl } from '../unierror.uts';
  8. class SQLiteContext extends SQLiteOpenHelper {
  9. private dbName: string | null;
  10. private forceRecreateTables: boolean;
  11. constructor(name: string, forceRecreate: boolean = false) {
  12. // 使用应用内部存储路径而不是静态资源路径
  13. const context = UTSAndroid.getAppContext()!!;
  14. // 版本号 - 必须在super调用前定义
  15. const dbPath = context.getDatabasePath(name).getAbsolutePath();
  16. console.log("Creating database at: " + dbPath);
  17. // 如果需要强制重新创建表,先删除现有数据库
  18. // if (forceRecreate) {
  19. console.log("Force recreating tables requested, deleting existing database if exists");
  20. context.deleteDatabase(name);
  21. // }
  22. //1版本号
  23. super(UTSAndroid.getAppContext()!!, name, null, 1);
  24. this.dbName = name;
  25. this.forceRecreateTables = forceRecreate;
  26. // 立即获取可写数据库以触发初始化
  27. console.log("Initializing database connection");
  28. this.getWritableDatabase();
  29. }
  30. override onCreate(db: SQLiteDatabase):void {
  31. console.log("SQLiteContext onCreate() called - creating database tables");
  32. // 创建表结构的DDL语句
  33. // 这里可以根据实际需要添加更多的CREATE TABLE语句
  34. const createTableSQLs = [
  35. // app_user表结构
  36. `CREATE TABLE IF NOT EXISTS app_user (
  37. id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
  38. username TEXT NOT NULL,
  39. name TEXT,
  40. userno INTEGER,
  41. password TEXT NOT NULL,
  42. token TEXT,
  43. status INTEGER NOT NULL DEFAULT 1,
  44. avatar TEXT,
  45. createtime TEXT,
  46. createuser INTEGER NOT NULL DEFAULT 1,
  47. updatetime TEXT,
  48. updateuser INTEGER NOT NULL DEFAULT 1,
  49. role TEXT,
  50. UNIQUE (id ASC),
  51. UNIQUE (username ASC),
  52. UNIQUE (userno ASC)
  53. )`
  54. // 可以添加更多表结构...
  55. ];
  56. // 执行所有建表语句
  57. for (const sql of createTableSQLs) {
  58. try {
  59. db.execSQL(sql);
  60. console.log("Created table with SQL: " + sql.substring(0, 50) + "...");
  61. } catch (e) {
  62. console.error("Error creating table: " + e);
  63. }
  64. }
  65. // 插入初始数据
  66. console.log("Inserting initial data into app_user table");
  67. const insertDataSQLs = [
  68. `INSERT INTO "app_user" ("id", "username", "name", "userno", "password", "token", "status", "avatar", "createtime", "createuser", "updatetime", "updateuser", "role")
  69. VALUES (1, 'admin', '管理员', 1, 'admin123', 'token1', 1, NULL, NULL, 1, NULL, 1, 'admin');`,
  70. `INSERT INTO "app_user" ("id", "username", "name", "userno", "password", "token", "status", "avatar", "createtime", "createuser", "updatetime", "updateuser", "role")
  71. VALUES (2, 'xuyunliang', '许运良', 2, '123456', 'token1', 1, NULL, NULL, 1, NULL, 1, 'user');`
  72. ];
  73. for (const sql of insertDataSQLs) {
  74. try {
  75. // 使用INSERT OR IGNORE避免重复插入
  76. const safeSql = sql.replace("INSERT INTO", "INSERT OR IGNORE INTO");
  77. db.execSQL(safeSql);
  78. console.log("Inserted initial data successfully");
  79. } catch (e) {
  80. console.error("Error inserting initial data: " + e);
  81. }
  82. }
  83. }
  84. override onUpgrade(db: SQLiteDatabase, oldVersion:Int, newVersion:Int):void {
  85. console.log("Upgrading database from version " + oldVersion + " to " + newVersion);
  86. // 数据库版本升级逻辑
  87. if (oldVersion < 2) {
  88. // 版本2的升级操作
  89. }
  90. // 可以添加更多版本升级逻辑
  91. }
  92. public executeSql(options: executeSqlOptions) {
  93. const database: SQLiteDatabase = this.getWritableDatabase();
  94. const SqlArray = options.sql.split(';');
  95. let result: executeSqlOptionsResult = {
  96. data: [] as boolean[],
  97. errMsg: 'ok'
  98. }
  99. try {
  100. for (let i = 0; i < SqlArray.length; i++) {
  101. if (SqlArray[i].length > 0) {
  102. const sql = SqlArray[i].replace(/^\s+/, '');
  103. try {
  104. database.execSQL(sql);
  105. result.data.push(true);
  106. } catch(e:Error) {
  107. result.data.push(false);
  108. }
  109. }
  110. }
  111. options.success?.(result);
  112. } catch (e) {
  113. const err = new createSQLiteContextFailImpl(1000002);
  114. result.errMsg = err.errMsg;
  115. options.fail?.(result);
  116. }
  117. options.complete?.(result);
  118. return result;
  119. }
  120. public selectSql(options: selectSqlOptions) {
  121. const database: SQLiteDatabase = this.getReadableDatabase();
  122. const SqlArray = options.sql.split(';');
  123. let result: selectSqlOptionsResult = {
  124. data: [] as UTSJSONObject[],
  125. errMsg: 'ok',
  126. }
  127. try {
  128. for (let i = 0; i < SqlArray.length; i++) {
  129. if (SqlArray[i].length > 0) {
  130. const sql = SqlArray[i].replace(/^\s+/, '');
  131. try {
  132. const cursor: Cursor = database.rawQuery(sql, null);
  133. //获取查询结果的字符串并push到result.data中
  134. if (cursor.moveToFirst()) {
  135. do {
  136. const row = cursor.getColumnCount();
  137. const utsJsonObject = {} as UTSJSONObject;
  138. for (let j:Int = 0; j < row; j++) {
  139. //rowArray.push(cursor.getString(j)!=null? cursor.getString(j):'');
  140. //let obj = {cursor.getColumnName(j):cursor.getString(j)!=null? cursor.getString(j):''}
  141. //rowArray.push(obj)
  142. utsJsonObject.set(cursor.getColumnName(j).toString(), cursor.getString(j)!=null? cursor.getString(j):'')
  143. }
  144. result.data.push(utsJsonObject);
  145. } while (cursor.moveToNext());
  146. }
  147. cursor.close();
  148. } catch(e:Error) {
  149. console.log(e)
  150. result.data.push({});
  151. }
  152. }
  153. }
  154. options.success?.(result);
  155. } catch (e) {
  156. const err = new createSQLiteContextFailImpl(1000003);
  157. result.errMsg = err.errMsg;
  158. options.fail?.(result);
  159. }
  160. options.complete?.(result);
  161. return result;
  162. }
  163. /*
  164. public close(){
  165. const database: SQLiteDatabase = this.getReadableDatabase();
  166. database.close();
  167. } */
  168. public transaction(options: transactionOptions) {
  169. const database: SQLiteDatabase = this.getReadableDatabase();
  170. const transaction = options.operation;
  171. let result: transactionResult = {
  172. errMsg: 'transaction:ok',
  173. }
  174. try {
  175. if (transaction == 'begin') {
  176. //开启事务
  177. database.execSQL('BEGIN TRANSACTION');
  178. } else if (transaction == 'commit') {
  179. //提交事务
  180. database.execSQL('COMMIT');
  181. } else if (transaction == 'rollback') {
  182. //回滚事务
  183. database.execSQL('ROLLBACK');
  184. }
  185. options.success?.(result);
  186. } catch (e) {
  187. let errCode = 1000008;
  188. if (transaction == 'begin') {
  189. errCode = 1000004;
  190. } else if (transaction == 'commit') {
  191. errCode = 1000005;
  192. } else if (transaction == 'rollback') {
  193. errCode = 1000006;
  194. }
  195. const err = new createSQLiteContextFailImpl(errCode);
  196. const errInfo = {errMsg:err.errMsg } as transactionResult ;
  197. options.fail?.(errInfo);
  198. }
  199. let ret = {
  200. errMsg: result.errMsg as string
  201. } as UTSJSONObject
  202. options.complete?.(result);
  203. return ret;
  204. }
  205. }
  206. export const createSQLiteContext = function (dbName: string): SQLiteContext {
  207. // 确保数据库名称包含.db后缀
  208. const name = dbName.endsWith('.db') ? dbName : dbName + '.db';
  209. console.log("Initializing SQLiteContext for database: " + name);
  210. // 注意:根据接口定义,只接受一个参数,默认不强制重新创建表
  211. return new SQLiteContext(name, false);
  212. }