【问题标题】:Errors using the ngCordova $cordovaSQLite plugin with Ionic将 ngCordova $cordovaSQLite 插件与 Ionic 一起使用时出错
【发布时间】:2017-09-04 17:16:56
【问题描述】:

我目前正在尝试使用我的应用程序实现 ngCordova SQLite 插件,但尚未产生有效的解决方案。我已关注Nic Raboy's blog post,了解如何将 SQLite 插件与您的 Ionic 项目一起实现为“T”,但我仍然收到错误:错误:未定义不是对象(正在评估 '$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>

我的代码如下。

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)');
    });
})

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);
            });
        });
    };
});

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

【问题讨论】:

  • 我不知道它是否会有所作为,但我相信 openDB 的 API 不再需要一个对象,而是一个字符串。在这种情况下,您只需传入“accounts.db”。

标签: ios sqlite ionic-framework ionic ngcordova


【解决方案1】:

正如 Nic Raboy 所说,ngCordova SQLite openDB 调用的语法已更改为以下内容,尽管文档已说明:

db = $cordovaSQLite.openDB( databasename, databaseType );

第二个参数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);
}

【讨论】:

  • 能否也提供官方文档的链接
【解决方案2】:

我花了半天多的时间来找出解决方案。在我的情况下,我将我的项目从以前版本的 ionic 更新到了新版本。但问题是我复制了 www 文件夹但没有添加 sqlite 插件再次。

所以我所做的只是修复:

cordova plugin add cordova-sqlite-storage

【讨论】:

  • 哈哈是的,这行得通,不小心下载了错误的sqllite插件...
【解决方案3】:

我不知道你是否找到了答案。我首先遇到了很多问题,而不是正确配置项目。

  • 一个问题可能是您应该作为最后一件事导入 ng-cordova.js,然后再导入 cordova.js。 应先导入 app.js 和 controller.js。

  • 如果您在 Web 应用程序中运行,可能会遇到 cordova ready 参数问题,该参数永远不会准备好,因此数据库将无法打开。

  • 尝试 Triccum 所说的新呼叫。

我不记得更多的问题了。

【讨论】:

    猜你喜欢
    • 2016-11-08
    • 2017-05-27
    • 1970-01-01
    • 2015-02-21
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多