【问题标题】:Use existing sqlite database in cordova在科尔多瓦使用现有的 sqlite 数据库
【发布时间】:2018-06-07 09:28:59
【问题描述】:

您好,我正在使用 ionic 框架和 cordova 创建一个应用程序,并希望使用 sqlite 数据库来存储数据。

那么我如何使用现有的 sqlite 数据库来实现这个目的呢? 如果我为平台编译,我必须将数据库保存在哪里,以便科尔多瓦可以找到并使用它?

编辑:

如果我尝试以推荐的方式打开数据库,我会收到以下错误:

[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数据库。

【问题讨论】:

    标签: sqlite cordova


    【解决方案1】:

    在经历了很长时间的痛苦之后,我解决了这个问题 :)

    预填充的数据库必须位于应用程序的“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');
                    });
                });
            });
        };
    

    查看此链接

    prepopulated db demo

    【讨论】:

    • 稍作修改,我也可以在我的项目中使用您的代码。非常感谢。
    【解决方案2】:

    那么我该如何使用现有的 sqlite 数据库呢?
    您可以通过使用内置的 WebSQL 来使用现有的 sqlite 数据库。您不需要安装任何插件。详情请查看链接here
    请注意,使用标准方法的存储量是有限制的。(我认为大约是 5MB)。
    如果您想存储超过允许的标准存储空间,则需要使用 sqlite 插件。详情链接here

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

    编辑 1:

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

    【讨论】:

    • 嗨,坦率地说,我刚刚编辑了我的帖子。我尝试了 with sqlite 插件的方式,但出现错误。
    • 好的,感谢您对带有cordova的预填充sqlite的建议。我会看看它。但我现在的主要问题是我确实收到了这个错误。我现在在 .ready 函数中创建数据库,如下例所示:blog.nraboy.com/2014/11/… 但我仍然遇到同样的错误。
    • 好吧,事实证明我必须将数据库名称存储在一个变量中,然后在其上调用 $cordovaSQLite.openDB(dbName) 以使其工作。但它只适用于 iOS 模拟器而不是浏览器。
    • 我不认为 Desktop 浏览器支持 SQlite 插件。如果您希望它也可以在桌面浏览器中工作,则需要使用本地存储或 IndexDB。
    • @frank,你的意思是IndexedDB,而不是IndexDB?
    【解决方案3】:
    if(window.cordova) {
          // App syntax
          db = $cordovaSQLite.openDB("myapp.db");
        } else {
          // Ionic serve syntax
          db = window.openDatabase("myapp.db", "1.0", "My app", -1);
        }
    

    【讨论】:

    • 请添加一些支持信息。这将对 OP 以及其他寻求答案的人有所帮助
    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-02
    • 2016-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多