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

Posted

技术标签:

【中文标题】升级到 64 位时 Cordova Sqlite 数据库错误【英文标题】:Cordova Sqlite Database Error when Upgrading to 64 Bit 【发布时间】:2020-03-05 00:24:31 【问题描述】:

由于 Google Play 商店最近进行了更新,建议所有应用程序现在必须符合 64 位标准才能由 Play 商店提供服务,我已尝试将我们的 Cordova android 应用程序更新为 64 位。

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

有问题的插件是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 数据库进行交互,我们现在有点不知所措。任何帮助实现这一点将不胜感激。

【问题讨论】:

【参考方案1】:

当您之前使用过密码驱动程序时,您要么需要对数据库进行解密,要么从一个新的数据库重新开始。可能有一个表RNM_Setting,但如果不解密,它的行为就好像它不存在一样。试过用“DB Browser for SQLite”在电脑上打开那个文件吗?

此外,您关于 64 位的推理没有多大意义,仅仅是因为 android-database-sqlcipher-ndk.jar 有一个 arm64-v8a/libsqlcipher.so

【讨论】:

对不起,我错过了那个信息,所以我确实有一个没有加密的数据库,所以加密不是问题 @DaRoGa 如果你已经发布了它,那么有加密的数据库。甚至不需要删除 SqlCipher,因为至少 3 个月以来它肯定支持 64 位。 我知道它适用于 64 位,但是,我的问题是它不是,我正在寻求帮助以找出原因

以上是关于升级到 64 位时 Cordova Sqlite 数据库错误的主要内容,如果未能解决你的问题,请参考以下文章

将 Cordova-Sqlite 2 插件集成到现有的 IBM MobileFirst 应用程序中

Cordova 上的 Sqlite,cordova-plugin-sqlite-2 限制为 32 位

安装nodejs+ionic+cordova环境心得

在普通桌面浏览器中进行测试时,如何将 sqlite 与 cordova 一起使用?

当游戏是 64 位时,Google Play 控制台 64 位错误

升级到 Cordova 5.0 + cordova-android@4.0 后 Ajax 请求失败