我正在尝试将 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% 确定数据库已加载?