Cordova SQLite:无法读取 null 的属性“事务”

2024-01-11

我正在尝试将 SQLite 集成到我的 Ionic 应用程序中,但我不断收到Cannot read property 'transaction' of null通过浏览器进行远程调试或测试时,尝试在数据库中查询设备上的数据时。

因此,我将所有配置、控制器和工厂拆分为单独的文件,所有文件均按功能/模块分组,因此我将每个模块的配置文件注入主应用程序,然后在配置文件内部注入控制器和工厂。

我不确定我构建应用程序的方式是否会破坏某些内容?

下面我列出了所有涉及的相关文件,

app.js

var app = angular.module('app', ['ionic', 'ngCordova', 'app.config', 'login.config']);

app.run(['$rootScope', '$ionicPlatform', 'DB', function($rootScope, $ionicPlatform, DB) {

    $ionicPlatform.ready(function() {

        if (window.cordova && window.cordova.plugins.Keyboard) {
            cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
        }

        if (window.StatusBar) {
            StatusBar.styleDefault();
        }

        if(navigator.splashscreen) {
            navigator.splashscreen.hide();
        }

        DB.init();

    });

}]);

应用程序配置.js

var app = angular.module('app.config', ['app.controller', 'app.factory']);

app.config(function($stateProvider, $urlRouterProvider, $httpProvider) {

    $stateProvider
        .state('app', {
            url: "/app",
            abstract: true,
            templateUrl: "templates/menu.html",
            controller: 'appController'
        });

    $urlRouterProvider.otherwise('/login');

});

app.constant('DB_CONFIG', {
    name: 'database.db',
    tables: [
        {
            name: 'users',
            columns: [
                {name: 'id', type: 'integer primary key'},
                {name: 'username', type: 'text'},
                {name: 'password', type: 'text'},
                {name: 'api_key', type: 'text'},
                {name: 'active', type: 'integer'}
            ]
        }
    ]
});

应用程序工厂.js

var appFactory = angular.module('app.factory', []);

appFactory.factory('DB', ['$q', '$cordovaSQLite', 'DB_CONFIG', function($q, $cordovaSQLite, DB_CONFIG) {

    var db = null;

    var init = function() {

        db = $cordovaSQLite.openDB({ name: DB_CONFIG.name });
        // I use this when testing in browser db = window.openDatabase(DB_CONFIG.name, '1.0', 'database', -1);

        _.each(DB_CONFIG.tables, function(table) {

            var columns = [];

            _.each(table.columns, function(column) {

                columns.push(column.name + ' ' + column.type);

            });

            var sql = 'CREATE TABLE IF NOT EXISTS ' + table.name + ' (' + columns.join(',') + ')';

            console.log('Table ' + table.name + ' initialized');

            query(sql);

        });

    };

    var query = function(sql, bindings) {

        bindings = typeof bindings !== 'undefined' ? bindings : [];

        return $cordovaSQLite.execute(db, sql, bindings);

    };

    var fetchAll = function(result) {

        var output = [];

        for (var i = 0; i < result.rows.length; i++) {
            output.push(result.rows.item(i));
        }

        return output;
    };

    var fetch = function(result) {
        return result.rows.item(0);
    };

    return {
        init: init,
        query: query,
        fetchAll: fetchAll,
        fetch: fetch
    };
}]);

登录.config.js

var loginConfig = angular.module('login.config', ['ionic', 'login.controller']);

loginConfig.config(function($stateProvider) {

    $stateProvider

        .state('login', {
            url: "/login",
            templateUrl: "modules/login/views/login.html",
            controller: 'loginController'
        });

});

登录.controller.js

var loginController = angular.module('login.controller', []);

loginController.controller('loginController', ['$scope', '$state', 'DB', function($scope, $state, DB) {

    $scope.doLogin = function() {

        var username = this.username;
        var password = this.password;

        DB.query('SELECT * FROM users WHERE username = ? and password = ?', [username, password]).then(function(result){
            console.log(result);
        }, function(error){
            console.log(error);
        });

    };

}]);

用户已经被插入到数据库中,有时它可以工作,我会得到结果,大多数时候它不会,并且我收到上述错误。

我假设这是因为在查询数据库之前数据库没有及时初始化?

如果是这样,有没有一种方法可以在查询之前 100% 确定数据库已加载?


我遇到了同样的问题,数据库无法正确初始化(这是随机发生的),使用带有 defer 和 $ionicPlatform.ready(function (){}); 的 Promise;

参考:https://gist.github.com/borissondagh/29d1ed19d0df6051c56f https://gist.github.com/borissondagh/29d1ed19d0df6051c56f

example:

angular.module('myapp.services', [])

.factory('DBA', function($cordovaSQLite, $q, $ionicPlatform) {
  var self = this;

  // Handle query's and potential errors
  self.query = function (query, parameters) {
    parameters = parameters || [];
    var q = $q.defer();

    $ionicPlatform.ready(function () {
      $cordovaSQLite.execute(db, query, parameters)
        .then(function (result) {
          q.resolve(result);
        }, function (error) {
          console.warn('DB error found');
          console.warn(error);
          q.reject(error);
        });
    });
    return q.promise;
  }

  // Process a result set
  self.getAll = function(result) {
    var output = [];

    for (var i = 0; i < result.rows.length; i++) {
      output.push(result.rows.item(i));
    }
    return output;
  }

  // Process a single result
  self.getById  = function(result) {
    var output = null;
    output = angular.copy(result.rows.item(0));
    return output;
  }

  return self;
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cordova SQLite:无法读取 null 的属性“事务” 的相关文章

随机推荐

  • 现有的 Kafka 主题镜像方法的主要区别是什么

    Kafka MirrorMaker是一种将 Kafka 主题从源代理镜像到目标代理的基本方法 不幸的是 它不符合我的可配置要求 我的要求很简单 解决方案应该是JVM应用程序 如果目标主题不存在 则创建它 解决方案应该能够向目标主题名称添加前
  • InvalidKeyException 非法密钥大小

    我有一个测试 在我的开发 MacBook Pro 上运行良好 但在持续集成 TeamCity 服务器中运行失败 错误如下 java security InvalidKeyException Illegal key size at javax
  • 减小构建尺寸

    当我在 VS2013 中使用 C 运行时库的静态链接时 有什么方法可以降低构建大小吗 我的原始文件只有 15kb 但我无法在其他计算机上运行它而不弹出缺少 dll 的消息 我决定使用静态链接 现在大小约为 100kb 我正在使用Window
  • 在 C++11 中解析 int - stoi

    我正在尝试获取一个字符串并将其解析为一个 int 我已经阅读了很多答案 似乎使用stoi是最新的方式 在我看来stoi uses std 但我得到了Function stoi could not be resolved德斯皮特雷using
  • 如何将二进制密钥传递给 openssl

    我很难尝试将关键参数传递给openssl dgst 我正在尝试连接 GDAX 交易平台 每个请求都必须由 HMAC 签名 他们明确表示 首先对字母数字秘密字符串进行 base64 解码 结果为 64 字节 然后将其用作 HMAC 的密钥 这
  • 循环遍历数据框以按城市删除异常值(调用函数)

    我有一个包含日期 城市 销售额的数据框 Date City Sales 2008 01 01 C1 10000 2008 01 01 C2 2000 2008 01 02 C1 13000 2008 01 02 C2 5000 and so
  • 打印到达第 n 级楼梯的方法

    我最近在面试中遇到了这个问题 有n楼梯 一个人站在底部想要到达顶部 该人一次可以爬 1 级楼梯或 2 级楼梯 打印出人们到达顶峰的所有可能方式 例如 n 4输出 1 2 3 4 1 2 4 1 3 4 2 3 4 2 4 但我无法正确编码
  • MPAndroidChart BarChart水平/垂直

    我正在使用MPAndroid图表 https github com PhilJay MPAndroidChart图书馆 在 BarChart 中 默认情况下所有条形都是垂直的 自下而上 如何将其水平显示 有两种类型条形图的方向 The no
  • Python3 递归求和整数的数字

    我需要帮助实现一个函数 该函数将获取整数的数字并将它们加在一起 只要 sumDigits 函数实现了递归 它就有效 并且 main 函数必须保持原样 我将在下面包含一个模板 def sumdigits value recursively s
  • 在 Windows 2008 Server 中从 MP3/WAV 文件生成视觉(波形)?

    是否有 某处 适用于 Windows 的命令行程序可以从 MP3 WAV 创建 PNG JPEG 视觉效果 EDIT This is a good example of how the image should look like Sox
  • Stream.CopyTo() 方法可以保存不完整的流吗?

    我有一个 WCF 服务 它允许我分块上传文件 我想知道的是 在任何情况下 这段代码是否会导致上传的流仅部分附加到目标流 我的日志显示所有发送的流都是 512000 字节 我在客户端设置 并且到目前为止我已经发送了 9 个块中的 6 个块 但
  • Facebook 需要 CURL PHP 扩展

    我正在尝试在我的 apache 服务器上运行我的第一个 facebook php 应用程序 它给出了错误Facebook needs the CURL PHP extension 我已经添加了行extension php curl dll在
  • 哪个版本的 Grails 支持 JDK 8?

    我正在为 Grails 使用以下配置 Grails 版本 2 4 0 Maven版本3 2 5 JDK版本1 8 0 51 当我运行服务器时 我收到两个错误 在我的 POM 中 我使用grail gorm and grail crud依赖关
  • 使用 ruby​​/fastercsv 将 CSV 文件合并到公共字段上

    我有一个包含许多列的 主 文件 1 2 3 4 5 我还有一些其他文件 其行数比主文件少 每个文件的列数 1 6 我想合并这些匹配的文件在第 1 列字段上并将第 6 列添加到主字段 我见过一些 python UNIX 解决方案 但如果合适的
  • 加载数据问题

    数据链接 Data https www dropbox com s yt4l10nel5bwxoq GTAP ConsIndex csv Code ccfsisims lt read csv file F Purdue University
  • VS2010:自动生成的文件和 XML 文档

    这真的只是重新询问这个问题询问有关 Visual Studio 2008 https stackoverflow com questions 1445723 vs2008 autogenerated files and xml docume
  • Django 管理表格内联查找选择下拉框用于非常大的查询集

    我有一个 django admin 表格内联 其中我有form ProdForm其中持有一个modelchoicefield选择框如下 class ProdForm forms ModelForm productid forms Model
  • 分叉与线程

    我以前在我的应用程序中使用过线程并且很了解它的概念 但最近在我的操作系统讲座中我遇到了 fork 这与线程类似 我用谷歌搜索了它们之间的区别 我发现 Fork只不过是一个新进程 看起来与旧进程或父进程一模一样 但它仍然是一个不同的进程 具有
  • 当我在 iOS13.2 中加载 WKWebView 时,为什么会收到控制台警告:[Process] Kill() 返回意外错误 1?

    自从我安装了iOS 13 2 测试版 我收到了调试控制台错误消息 每次我在情节提要中加载带有 WKWebView 对象的 ViewController 时 都会发生这种情况 然后 当 Web 视图可见时 会连续显示以下消息 2019 10
  • Cordova SQLite:无法读取 null 的属性“事务”

    我正在尝试将 SQLite 集成到我的 Ionic 应用程序中 但我不断收到Cannot read property transaction of null通过浏览器进行远程调试或测试时 尝试在数据库中查询设备上的数据时 因此 我将所有配置