您好我正在使用离子框架和cordova创建一个应用程序,并希望使用sqlite数据库来存储数据。
那么我如何才能将现有的sqlite数据库用于此目的? 我在哪里保存数据库,以便cordova可以找到它并在我编译平台时使用它?
如果我尝试以推荐的方式打开数据库,则会出现以下错误:
[Error] TypeError: undefined is not an object (evaluating 'n.sqlitePlugin.openDatabase')
openDB (ng-cordova.min.js, line 9)
(anonyme Funktion) (app.js, line 19)
(anonyme Funktion) (ionic.bundle.js, line 44243)
onPlatformReady (ionic.bundle.js, line 2396)
onWindowLoad (ionic.bundle.js, line 2375)
以下是我的index.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">
<!-- ionic/angularjs js -->
<script src="lib/ionic/js/ionic.bundle.js"></script>
<!-- cordova sqlite extenseion -->
<script src="js/ng-cordova.min.js"></script>
<!-- cordova script (this will be a 404 during development) -->
<script src="cordova.js"></script>
<!-- your app's js -->
<script src="js/app.js"></script>
<script src="js/controllers.js"></script>
</head>
我的app.js看起来像这样:
//Database variable
var db = null;
angular.module('starter', ['ionic', 'starter.controllers', 'ngCordova'])
.run(function($ionicPlatform, $cordovaSQLite) {
$ionicPlatform.ready(function() {
// Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
// for form inputs)
if (window.cordova && window.cordova.plugins.Keyboard) {
cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
}
if (window.StatusBar) {
// org.apache.cordova.statusbar required
StatusBar.styleDefault();
}
db = $cordovaSQLite.openDB({ name: "db.spareParts" });
var query = "SELECT cars.name FROM cars";
$cordovaSQLite.execute(db, query).then(function(res) {
if(res.rows.length > 0) {
console.log("SELECTED -> " + res.rows.item(0).name);
} else {
console.log("No results found");
}
}, function (err) {
console.error(err);
});
});
})
数据库db.spareParts存储在根www目录中,是一个sqlite3数据库。
答案 0 :(得分:6)
我在经历了很长时间的痛苦之后解决了这个问题:)
预先填充的数据库必须位于&#34; dataDirectory&#34;你的申请
首先你需要检查db文件是否存在于该目录中,如果没有,你必须从应用程序目录(即/ www文件夹)中复制它
检查这段代码
$ionicPlatform.ready(function() {
src = cordova.file.dataDirectory + 'data.sqlite';
window.resolveLocalFileSystemURL(src, function () {
db = sqlitePlugin.openDatabase('data.sqlite');
}, function () {
$scope.copyDb('data.sqlite');
});
$scope.copyDb = function (dbName) {
var sourceFileName = cordova.file.applicationDirectory + 'www/' + dbName;
var targetDirName = cordova.file.dataDirectory;
return Promise.all([
new Promise(function (resolve, reject) {
resolveLocalFileSystemURL(sourceFileName, resolve, reject);
}),
new Promise(function (resolve, reject) {
resolveLocalFileSystemURL(targetDirName, resolve, reject);
})
]).then(function (files) {
var sourceFile = files[0];
var targetDir = files[1];
return new Promise(function (resolve, reject) {
targetDir.getFile(dbName, {}, resolve, reject);
}).then(function () {
console.log("file already copied");
}).catch(function () {
console.log("file doesn't exist, copying it");
return new Promise(function (resolve, reject) {
sourceFile.copyTo(targetDir, dbName, resolve, reject);
}).then(function () {
console.log("database file copied");
db = sqlitePlugin.openDatabase('data.sqlite');
});
});
});
};
检查此链接
答案 1 :(得分:1)
那么如何才能将现有的sqlite数据库用于此目的呢?
您可以使用内置的WebSQL来使用现有的sqlite数据库。您不需要安装任何插件。有关详细信息,请参阅链接here
请注意,使用标准方法的存储量有限制。(我认为它大约是5MB)
如果要存储超过允许的标准存储空间,则需要使用sqlite插件。链接here了解详情。
我在哪里保存数据库,以便cordova可以找到它并在我编译平台时使用它?
您无需指定存储数据库的位置路径。数据库打开函数调用将自动创建并存储它在方便的位置。
修改1:
我从您编辑的问题中了解到,您需要预先填充的 sqlite3数据库才能用于您的应用。
将数据库复制到www目录将不工作。您需要将预先填充的数据库复制到应用程序将其用于您的应用程序的默认位置。不同平台(iOS,Android,Windows)的位置不同。同样在平台内,数据库存储的位置路径也不同。例如,对于Android Jelly bean,位置路径与Android KitKat中的路径不同。因此,据我所知,您不会在Web上找到将数据库复制到应用程序默认位置的完整解决方案。
这是一个完全不同的主张
您需要在预先填充的sqlite with cordova 中搜索stackoverflow以获得有用的答案。
我已经回答的是从头开始在你的应用程序中创建一个新的数据库
也与您的错误有关
在调用任何 cordova / phonegap 相关代码之前,您需要检查是否已触发 deviceready 事件。
答案 2 :(得分:-2)
if(window.cordova) {
// App syntax
db = $cordovaSQLite.openDB("myapp.db");
} else {
// Ionic serve syntax
db = window.openDatabase("myapp.db", "1.0", "My app", -1);
}