在 Ionic 中使用 ngCordova $cordovaSQLite 插件时出错
Errors using the ngCordova $cordovaSQLite plugin with Ionic
我目前正在尝试使用我的应用程序实施 ngCordova SQLite 插件,但尚未生成有效的解决方案。我已经关注 Nic Raboy's blog post 关于如何将 SQLite 插件与你的 Ionic 项目一起实现到 "T," 但我仍然收到错误:错误:未定义不是一个object (evaluating '$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);
});
});
};
});
您可能拥有的任何信息或帮助都会有所帮助。提前致谢。
正如 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);
}
不知道你是否找到了答案。我首先遇到了很多问题,而不是正确配置项目。
一个问题可能是您应该作为最后一件事导入 ng-cordova.js 然后 cordova.js。
app.js 和 controller.js 应首先导入。
如果您 运行 在网络应用程序中可能会遇到 cordova 就绪参数的问题,该参数不会永远准备就绪,因此数据库不会打开。
尝试使用 Triccum 所说的新呼叫。
我不记得更多问题了。
我花了半天多的时间来找出解决方案 out.In 我的情况是我将我的项目从以前版本的 ionic 更新到更新的版本 one.But 问题是我复制了 www 文件夹但没有'重新添加sqlite插件。
所以我所做的就是修复:
cordova plugin add cordova-sqlite-storage
我目前正在尝试使用我的应用程序实施 ngCordova SQLite 插件,但尚未生成有效的解决方案。我已经关注 Nic Raboy's blog post 关于如何将 SQLite 插件与你的 Ionic 项目一起实现到 "T," 但我仍然收到错误:错误:未定义不是一个object (evaluating '$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);
});
});
};
});
您可能拥有的任何信息或帮助都会有所帮助。提前致谢。
正如 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);
}
不知道你是否找到了答案。我首先遇到了很多问题,而不是正确配置项目。
一个问题可能是您应该作为最后一件事导入 ng-cordova.js 然后 cordova.js。 app.js 和 controller.js 应首先导入。
如果您 运行 在网络应用程序中可能会遇到 cordova 就绪参数的问题,该参数不会永远准备就绪,因此数据库不会打开。
尝试使用 Triccum 所说的新呼叫。
我不记得更多问题了。
我花了半天多的时间来找出解决方案 out.In 我的情况是我将我的项目从以前版本的 ionic 更新到更新的版本 one.But 问题是我复制了 www 文件夹但没有'重新添加sqlite插件。
所以我所做的就是修复:
cordova plugin add cordova-sqlite-storage