开发者问题收集

在 cordova 中使用现有的 sqlite 数据库

2015-02-23
11069

您好,我正在使用 Ionic 框架和 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 数据库。

3个回答

经过很长一段时间的痛苦,我终于解决了这个问题:)

预填充的数据库必须位于应用程序的“dataDirectory”中

首先,您需要检查该目录中是否存在 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');
                });
            });
        });
    };

检查此链接

预填充的 db 演示

Awad Haj
2016-08-29

那么我该如何使用现有的 sqlite 数据库来实现此目的?
您可以使用内置的 WebSQL 使用现有的 sqlite 数据库。您 不需要 安装任何插件。请参阅链接 此处 了解更多详细信息。
请注意,使用标准方法的存储量是有限制的。(我认为大约是 5MB)。
如果您想存储超过允许的标准存储量,则需要使用 sqlite 插件。有关详细信息,请参阅 此处

如果我为某个平台编译,我必须将数据库保存在哪里,以便 cordova 可以找到它并使用它?
您无需指定存储数据库的位置路径。数据库打开函数调用将自动 创建 并将其存储到方便的位置。

编辑 1:

从您编辑的问题中我了解到,您需要一个 预填充 的 sqlite3 db 来用于您的应用程序。
将您的数据库复制到 www 目录 不起作用 。您需要 复制 预填充的数据库到应用程序将在您的应用程序中使用它的默认位置。不同平台(iOS、Android、Windows)的位置不同。此外,在平台内,数据库存储的位置路径也不同。例如,对于 Android Jelly bean,其位置路径与 Android KitKat 中的位置路径不同。因此,据我所知,您不会在网络上找到将数据库复制到应用程序默认位置的完整解决方案。
这是一个完全不同的主张。
您需要在 stackoverflow 上搜索 pre populated sqlite with cordova 以获得有用的答案。
我的回答是从头开始在您的应用程序中创建一个新的数据库。
也与您的错误有关。
您需要在调用任何 cordova/phonegap 相关代码之前检查 deviceready 事件是否已触发。

frank
2015-02-23
if(window.cordova) {
      // App syntax
      db = $cordovaSQLite.openDB("myapp.db");
    } else {
      // Ionic serve syntax
      db = window.openDatabase("myapp.db", "1.0", "My app", -1);
    }
Fernando Manzanares
2015-09-04