使用带有Ionic的ngCordova $ cordovaSQLite插件时出错

Tri*_*cum 2 sqlite ios ionic-framework ionic ngcordova

我目前正在尝试使用我的应用程序实现ngCordova SQLite插件,但尚未生成可行的解决方案.我跟随Nic Raboy的博客文章,了解如何使用Ionic项目将SQLite插件实现为"T",但我仍然收到错误:错误:undefined不是对象(评估'$ window.sqlitePlugin.openDatabase')当我尝试在iOS模拟器中运行应用程序时.

我还验证了ngCordova和插件已加载到我的项目中.

这是我的脚本如何加载到我的项目中的顺序:

<script src="lib/ionic/js/ionic.bundle.js"></script>
<script src="lib/ngCordova/dist/ng-cordova.js"></script>
<script src="cordova.js"></script>
<script src="js/app.js"></script>
<script src="js/controllers.js"></script>
Run Code Online (Sandbox Code Playgroud)

我的代码如下.

app.js

angular.module('whoPaidLast', ['ionic', 'ngCordova', 'whoPaidLast.controllers', 'whoPaidLast.services'])

.run(function($ionicPlatform, $cordovaSQLite) {
    $ionicPlatform.ready(function() {
        if(window.cordova && window.cordova.plugins.Keyboard) {
            cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
        }
        if(window.StatusBar) {
            StatusBar.styleDefault();
        }

        db = $cordovaSQLite.openDB({ name: 'accounts.db' });
        $cordovaSQLite.execute(db, 'CREATE TABLE IF NOT EXISTS accounts (id integer primary key autoincrement, firstname text, lastname text, paid numeric, date text)');
    });
})
Run Code Online (Sandbox Code Playgroud)

controllers.js

angular.module('whoPaidLast.controllers', [])

.controller('DashCtrl', ['$ionicPlatform', '$scope', '$ionicModal', '$ionicActionSheet', '$cordovaSQLite', function ($ionicPlatform, $scope, $ionicModal, $ionicActionSheet, $cordovaSQLite) {

    $scope.getList = function() {
        var query = 'SELECT id, firstname, lastname, paid, date FROM accounts ORDER BY lastname ASC';
        var db = $cordovaSQLite.openDB({ name: 'accounts.db' });

        $ionicPlatform.ready(function() {
            $cordovaSQLite.execute(db, query, [id, firstname, lastname, paid, date]).then(function(result) {
                if(result.rows.length > 0) {
                    console.log('rows =' + result.rows);
                } else {
                    $scope.results = [];
                }
            }, function(error) {
                console.error(err);
            });
        });
    };
});
Run Code Online (Sandbox Code Playgroud)

您可能拥有的任何信息或帮助都会有所帮助.提前谢谢.

Tri*_*cum 7

就像Nic Raboy所说的那样,ngCordova SQLite openDB调用的语法已经改变了,尽管文档已经说明了以下内容:

db = $cordovaSQLite.openDB( databasename, databaseType );
Run Code Online (Sandbox Code Playgroud)

第二个参数databaseType是数据库的存储方式.在我的情况下,我使用数字用于将数据库存储在iTunes隐藏的背景中,但使用iCloud进行备份.

通过更改此调用的语法,这修复了我的错误.

注意:如果您尝试在浏览器中工作,则此打开的数据库调用将出错.要解决此问题,您需要引入"if"语句以根据您的环境更改调用.以下对我有用:

if (window.cordova && window.SQLitePlugin) {
    var db = $cordovaSQLite.openDB( 'accounts.db', 1 );
} else {
    db = window.openDatabase('accounts', '1.0', 'accounts.db', 100 * 1024 * 1024);
}
Run Code Online (Sandbox Code Playgroud)