iOS应用程序 - SQLite预装数据库未正确加载,cordova

时间:2016-08-17 16:13:19

标签: javascript ios sqlite cordova ionic-framework

编辑:我尝试通过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')

0 个答案:

没有答案