升级到64位时的Cordova Sqlite数据库错误

问题描述 投票:0回答:1

由于Google Play商店的最新更新,建议所有应用现在必须符合64位才能由Play商店提供,因此我试图将Cordova Android应用更新为64位。

根据Google的建议,我们已经确定只有一个不符合64位标准的cordova插件。但是,这引起了痛苦的问题。

有问题的插件是cordova-sqlcipher-adapter。我们依靠它来加密我们的SQLite数据库并为应用程序提供数据库服务。现在,在加密方面,我们已不再依赖此插件。因此,它释放了我们升级到64位的空间。

[当尝试对其进行升级时,我们意识到此插件是基于另一个插件cordova-sqlite-storage构建的,该插件处理打开的数据库并执行命令。因此,为简化起见,我们删除了cordova-sqlcipher-adapter并添加了cordova-sqlite-storage插件,以确保从密码方面不会出现任何问题。

[在使用符合64位标准的新插件运行应用程序时,尝试在其中一个数据库上运行查询时,应用程序出错。

返回的错误是:

Error: a statement error callback did not return false: no such table: RNM_Setting (code 1): , while compiling: SELECT s.Value AS [Value] FROM <MYTABLE> s WHERE s.[Key] = <PARAM>

我们尝试了不同的版本,但始终会遇到相同的问题,并且无法找到通过Cordova Android应用程序与SQLite数据库进行交互的另一种方法。

我们已经确认所讨论的数据库存在于正确的目录中,并填充有所涉及的数据和表。我们甚至拔出了数据库并对其进行了精确的查询,该查询成功了,因此不会成为数据库问题。

用于打开数据库的代码是:

SQLiteWrapper.prototype.OpenDatabase = function () {
    var self = this;

    if (this.db === null && this.hasSqlite) {
        this.db = window.sqlitePlugin.openDatabase({ name: this.dbName, iosDatabaseLocation: 'Documents' });
    }
};

this.GetSettingValue = function (settingKey, successCallback, failCallback) {
    var self = this;
    try {
        var sql = ["SELECT ",
                    "   s.Value AS [Value] ",
                    "FROM ",
                    "   <MYTABLE> s ",
                    "WHERE ",
                    "   s.[Key] = ? "];
        sql = sql.join("");
        var params = [settingKey];

        this.sql.GetSingleItem(sql, params, this.ReadSettingFromDb, successCallback, fail);
    } catch (e) {
        fail(e);
    }

    function fail(e) {
        self.CallbackError(failCallback, "GetSettingValue", e);
    };
}

SQLiteWrapper.prototype.GetSingleItem = function (sql, params, rowRead, successCallback, failCallback) {
    var self = this;
    try {
        this.OpenDatabase();
        this.db.transaction(function (tx) {
            tx.executeSql(sql, params, executeSuccess, executeFail);
        }, function (e) {
            fail(e);
        });

        function executeSuccess(tx, rs) {
            var item = null;
            try {
                if (rs.rows.length > 0) {
                    var row = rs.rows.item(0);
                    item = rowRead(row);
                }
                successCallback(item);
            } catch (e) {
                fail(e);
            }
        }

        function executeFail(tx, e) {
            fail(e);
        }
    } catch (e) {
        fail(e);
    }

    function fail(e) {
        self.CallbackError(failCallback, "GetSingleItem", e);
    }
};

this.ReadSettingFromDb = function (row) {
    return row.Value;
};

关于如何以兼容64位的方式与SQLite数据库进行交互,我们现在有些茫然。任何帮助实现这一目标的方法将不胜感激。

android sqlite cordova 64-bit x86-64
1个回答
0
投票
以前使用密码驱动程序时,您需要解密数据库或从新的数据库开始。可能有一个表RNM_Setting,但是如果没有解密,它的行为就好像它不存在一样。是否曾尝试使用“ DB Browser for SQLite”在计算机上打开该文件?

此外,仅因为android-database-sqlcipher-ndk.jar具有arm64-v8a/libsqlcipher.so,所以您对64位的推理就没有多大意义。

© www.soinside.com 2019 - 2024. All rights reserved.