Ошибка базы данных Cordova Sqlite при обновлении до 64 бит - PullRequest
0 голосов
/ 08 ноября 2019

В связи с недавним обновлением в Google Play Store, которое сообщило, что все приложения должны быть совместимы с 64-битной версией для обслуживания в Play Store, я попытался обновить наше приложение 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>

Мы пробовали разные версии, но всегдав конечном итоге с той же проблемой и не может найти другой способ взаимодействия с базами данных SQLite из приложения Android Cordova.

Мы подтвердили, что рассматриваемая база данных существует в правильном каталоге и заполнена данными и таблицей ввопрос. Мы даже вытащили базу данных и выполнили точный запрос, который не может быть проблемой базы данных.

Код, используемый для открытия базы данных:

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;
};

Мы находимсяТеперь немного затрудняюсь, как взаимодействовать с базой данных SQLite в 64-битном режиме. Любая помощь для достижения этого будет принята с благодарностью.

1 Ответ

0 голосов
/ 08 ноября 2019

Когда вы уже использовали драйвер шифрования, вам необходимо либо дешифровать базу данных, либо начать заново с новой базы данных. Может быть таблица RNM_Setting, но без расшифровки она ведет себя так, как будто ее не существует. Вы когда-нибудь пытались открыть этот файл на компьютере с помощью «Браузер БД для SQLite»?

Кроме того, ваши рассуждения о 64-битном не имеют большого смысла, просто потому что android-database-sqlcipher-ndk.jar имеет arm64-v8a/libsqlcipher.so.

...