Cordova SQLite:无法读取属性“transaction”为null [英] Cordova SQLite: Cannot read property 'transaction' of null
问题描述
无法读取null
的属性'transaction'以查询设备上的数据。 所以我把我的所有配置,控制器和工厂分成独立的文件,所有的功能/模块,我注入每个模块的配置文件到主应用程序,然后在配置文件里面注入控制器和工厂。
我不知道如果我'
下面我列出了所有相关的文件,
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();
});
}]);
app.config.js p>
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'}
]
}
]
});
app.factory.js p>
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});
//我在浏览器中使用这个db = window.openDatabase(DB_CONFIG.name,'1.0','database',-1);
_.each(DB_CONFIG.tables,function
var columns = [];
_.each(table.columns,function(column){
columns.push +''+ 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));
}
返回输出;
};
var fetch = function(result){
return result.rows.item(0);
};
return {
init:init,
query:query,
fetchAll:fetchAll,
fetch:fetch
};
}]);
login.config.js p>
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'
});
}
login.controller.js p>
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])。然后(function(result){
console.log(result);
},function(error){
console.log(error);
});
};
}]);
用户已经插入数据库,有时它工作, ,大多数时候它不会,我得到上面提到的错误。
我假设这是因为数据库不是在时间初始化,在查询数据库?
如果是这样,我可以100%确保数据库在我查询之前已经加载了吗?
参考: https://gist.github。 com / borissondagh / 29d1ed19d0df6051c56f
例如:
angular.module('myapp.services',[])
.factory('DBA',function($ cordovaSQLite,$ q,$ ionicPlatform){
var self = this;
//处理查询和潜在错误
self.query = function(query,parameters){
parameters = parameters || [];
var q = $ q.defer();
$ ionicPlatform.ready(function(){
$ cordovaSQLite.execute(db,query,parameters)
.then(function(result){
q。解决(结果);
},函数(错误){
console.warn('DB error found');
console.warn(error);
q.reject错误);
});
});
return q.promise;
}
//处理结果集
self.getAll = function(result){
var output = [];
for(var i = 0; i< result.rows.length; i ++){
output.push(result.rows.item(i));
}
return output;
}
//处理单个结果
self.getById = function(result){
var output = null;
output = angular.copy(result.rows.item(0));
return output;
}
return self;
})
I am trying to integrate SQLite into my Ionic app, but I keep getting Cannot read property 'transaction' of null
while remote debugging or testing via the browser, when trying to query the DB for data on the device.
So I have split up all of my configs, controllers and factories into separate files, all grouped by feature / module, so I inject each module's config file into the main app, and then inside of the config file I inject the controller and factory.
I am not sure if the way that I've structured the app might be breaking something?
Below I've listed all of the relevant files involved,
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();
});
}]);
app.config.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'}
]
}
]
});
app.factory.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
};
}]);
login.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'
});
});
login.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);
});
};
}]);
The user has already been inserted into the database, and sometimes it works, and I get the results back, most times it doesn't, and I get the above mentioned error.
I am assuming this is because the DB is not initialising in time, before I query the database?
If so, is there a way that I can make 100% sure that the database has loaded before I query it?
I had the same issue, the DB does not initialize properly (This happens randomly), use promise with defer and $ionicPlatform.ready(function (){});
Reference: 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;
})
这篇关于Cordova SQLite:无法读取属性“transaction”为null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!