使用Phonegap/Cordova实现CRUD操作遇安全策略及数据库未定义问题
解决Cordova/PhoneGap中SQLite初始化的安全策略报错问题
首先直接给你结论:你必须安装Cordova SQLite插件,这是解决问题的核心——现代Cordova/PhoneGap版本已经不再默认支持原生的window.openDatabase API,浏览器的安全策略(CSP)和Cordova的架构变更都限制了这个原生API的使用,这就是你看到"突破用户代理安全策略"报错的根本原因,数据库创建失败自然导致后续db.transaction出现"Cannot read property 'transaction' of undefined"的错误。
下面是具体的解决步骤和注意事项:
第一步:安装SQLite插件
在你的Cordova项目根目录下执行以下命令:cordova plugin add cordova-sqlite-storage这个插件提供了符合Cordova安全规范的SQLite操作API,完全替代了原生的
window.openDatabase。第二步:修正数据库初始化代码
不要用window.openDatabase,改用插件提供的window.sqlitePlugin.openDatabase,而且必须在Cordova的deviceready事件之后执行初始化——这是很多新手容易踩的坑:window.onload触发时,Cordova的插件还没完全加载就绪,直接调用API必然会出错。示例代码如下:
// 等待设备就绪事件,这是Cordova应用初始化插件API的正确时机 document.addEventListener("deviceready", onDeviceReady, false); function onDeviceReady() { // 使用SQLite插件打开数据库 window.sqlitePlugin.openDatabase({ name: 'employee.db', // 数据库名称 location: 'default' // 存储位置,默认配置即可 }, function(db) { // 数据库打开成功,执行创建表等CRUD前置操作 db.transaction(function(tx) { tx.executeSql('CREATE TABLE IF NOT EXISTS employees (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)'); }, function(error) { console.error('事务执行失败: ' + error.message); }, function() { console.log('表创建成功,可以开始CRUD操作了'); }); }, function(error) { console.error('数据库打开失败: ' + error.message); }); }额外注意事项
- 确保你的Cordova项目配置文件(
config.xml)中没有过于严格的CSP(内容安全策略)限制SQLite插件的操作,默认配置一般没问题,如果自定义了CSP,要允许gap://ready和相关的本地资源访问。 - 所有依赖Cordova插件的API都要在
deviceready事件触发后调用,这是Cordova应用开发的基本规范,别再用window.onload来初始化插件相关功能了。
- 确保你的Cordova项目配置文件(
内容的提问来源于stack exchange,提问作者mountain
相关产品推荐
相关产品推荐

