编辑:我尝试通过Ionic View并通过Xcode进行测试,以确保问题出在Ionic View上,而不是其他问题。在通过Xcod进行测试时,代码在iPad上按预期工作,因此,如果您使用不在this short list View兼容插件上的插件,它似乎无法正常工作。
原始问题:
我目前正在测试使用SQLite作为移动设备的后端数据库,我正在寻找的功能(使用预先加载的数据库并在UI中显示多个条目)在iOS模拟器中工作但不是在实际设备上。我正在使用Ionic View在设备上查看它。
app.js
var db = null;
var example = angular.module('app', ['ionic', 'ngCordova'])
example.run(function($ionicPlatform, $cordovaSQLite, $window) {
$ionicPlatform.ready(function() {
if(window.cordova && window.cordova.plugins.Keyboard) {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
cordova.plugins.Keyboard.disableScroll(true);
}
if(window.StatusBar) {
StatusBar.styleDefault();
}
window.plugins.sqlDB.copy("database.db", 2, function() {
db = $cordovaSQLite.openDB({name: "database.db", location: 'default'});
$window.alert("db copy success");
}, function(error) {
console.error("app.js::onReady - Error: " + JSON.stringify(error));
db = $cordovaSQLite.openDB({name: "database.db", location: 'default'});
$window.alert("db copy failure");
});
});
})
controllers.js
example.controller("testCtrl", function($scope, $cordovaSQLite, $window) {
$scope.results = [];
$scope.test = function() {
$window.alert("Test");
}
$scope.select = function(name) {
//console.log(db.tables);
$window.alert("testCtrl::select - Called");
var query = "SELECT name FROM clinic WHERE country = ?";
try {
$cordovaSQLite.execute(db, query, [name]).then(function(res) {
$window.alert("testCtrl::select/execute - Called");
if(res.rows.length > 0) {
for(var i = 0; i < 5; i++) {
$scope.results.push({name: res.rows.item(i).name});
}
} else {
console.log("No results found.");
$window.alert("No results found");
}
}).catch(function(err) {
console.log("controller.js::select - Error: " + JSON.stringify(err));
$window.alert("controller.js::select - Error: " + JSON.stringify(err));
});
} catch(error) {
$window.alert(error);
}
}
})
的index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no, width=device-width">
<title></title>
<link href="lib/ionic/css/ionic.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
<!-- IF using Sass (run gulp sass first), then uncomment below and remove the CSS includes above
<link href="css/ionic.app.css" rel="stylesheet">
-->
<!-- ionic/angularjs js -->
<script src="lib/ionic/js/ionic.bundle.js"></script>
<script src="js/ng-cordova.min.js"></script>
<script src="cordova.js"></script>
<!-- your app's js -->
<script src="js/app.js"></script>
<script src="js/controllers.js"></script>
</head>
<body ng-app="app" ng-controller="testCtrl">
<ion-pane>
<ion-header-bar class="bar-stable">
<h1 class="title">Ionic Blank Starter</h1>
</ion-header-bar>
<ion-content>
<ion-item ng-click="select('Canada')">Select</ion-item>
<ion-item ng-click="test()">Destroy</ion-item>
<ion-item class="item-divider">Test List</ion-item>
<ion-item ng-repeat="x in results track by $index">{{x.name}}</ion-item>
</ion-content>
</ion-pane>
</body>
</html>
当我使用Ionic View加载应用程序并点击选择时,它应该打印出来自加拿大的前5个诊所的名称。警报告诉我, testCtrl 中的 select()函数被调用,但显然它在null上被调用。所以数据库没有被复制/打开。 window.sqlDB.copy()块内的警报根本没有被调用。
我已尝试在 $ timeout 中包装该块,但这并没有帮助。
我得到的确切错误是:
TypeError: null is not an object (evaluating 'n.transaction')