uniapp 升级Android SQLite 3.46.0

336 阅读1分钟
  1. 下载 SQLite 版本库
  2. 编写Uniapp插件
  3. 不想卷了去插件市场看看-Android Sqlite 3.46.0
  4. 如需模块化,需要自定义打包,一杯咖啡,联系sunfeixiang2020@163.com 感谢

部分代码如下

    @UniJSMethod(uiThread = false)
    public boolean isOpenDatabase(String name) {
        SQLiteDatabase database = map.get(name);
        return database != null && database.isOpen();
    }

    @UniJSMethod(uiThread = false)
    public void openDatabase(String name, UniJSCallback success, UniJSCallback fail) {
        if (openDatabase(name, fail)) {
            success(success);
        }
    }

    @UniJSMethod(uiThread = false)
    public void closeDatabase(String name, UniJSCallback success, UniJSCallback fail) {
        final SQLiteDatabase database = map.remove(name);
        if (database != null) {
            database.close();
        }
        success(success);
    }

    @UniJSMethod(uiThread = false)
    public void transaction(String name, String opt, UniJSCallback success, UniJSCallback fail) {
        if (!isOpenDatabase(name)) {
            fail(fail, "database 没有打开");
            return;
        }
        final SQLiteDatabase database = map.get(name);
        if (database == null) {
            fail(fail, "database 已关闭");
            return;
        }
        switch (opt) {
            case "begin":
                database.beginTransaction();
                success(success);
                break;
            case "commit":
                database.setTransactionSuccessful();
                database.endTransaction();
                success(success);
                break;
            case "rollback":
                database.endTransaction();
                success(success);
                break;
            default:
                fail(fail, "指令不正确,仅支持begin,commit,rollback");
                break;
        }
    }

    @UniJSMethod(uiThread = false)
    public void executeSql(String name, JSONArray sqlList, UniJSCallback success, UniJSCallback fail) {
        if (!isOpenDatabase(name)) {
            fail(fail, "database 没有打开");
            return;
        }
        final SQLiteDatabase database = map.get(name);
        if (database == null) {
            fail(fail, "database 已关闭");
            return;
        }
        if (sqlList.isEmpty()) {
            fail(fail, "没有需要执行的sql");
            return;
        }
        try {
            for (int i = 0; i < sqlList.size(); ++i) {
                String s = sqlList.getString(i);
                if (!TextUtils.isEmpty(s.trim())) {
                    database.execSQL(s);
                }
            }
            success(success);
        } catch (Exception e) {
            fail(fail, e.toString());
        }
    }

    @UniJSMethod(uiThread = false)
    public void selectSql(String name, String sql, UniJSCallback success, UniJSCallback fail) {
        if (!isOpenDatabase(name)) {
            fail(fail, "database 没有打开");
            return;
        }
        final SQLiteDatabase database = map.get(name);
        if (database == null) {
            fail(fail, "database 已关闭");
            return;
        }
        if (sql == null || sql.isEmpty()) {
            fail(fail, "没有需要执行的sql");
            return;
        }
        try (Cursor cursor = database.rawQuery(sql, null)) {
            List<Map<String, Object>> list = new ArrayList<>();
            if (cursor.moveToFirst()) {
                String[] names = cursor.getColumnNames();
                int length = names.length;
                do {
                    Map<String, Object> obj = new HashMap<>();

                    for (int i = 0; i < length; ++i) {
                        int type = cursor.getType(i);
                        switch (type) {
                            case Cursor.FIELD_TYPE_NULL:
                                obj.put(names[i], org.json.JSONObject.NULL);
                                break;
                            case Cursor.FIELD_TYPE_INTEGER:
                            case Cursor.FIELD_TYPE_STRING:
                                BigDecimal decimal = new BigDecimal(String.valueOf(cursor.getDouble(i)));
                                obj.put(names[i], decimal.doubleValue());
                                break;
                            case Cursor.FIELD_TYPE_FLOAT:
                                obj.put(names[i], cursor.getString(i));
                                break;
                            case Cursor.FIELD_TYPE_BLOB:
                                obj.put(names[i], Arrays.toString(cursor.getBlob(i)));
                        }
                    }
                    list.add(obj);
                } while (cursor.moveToNext());
            }
            success(success, list);
        } catch (Exception e) {
            fail(fail, e.toString());
        }
    }