Cordova s​​qlite不会在$ cordovaSQLite.openDB或window.openDatabase上创建数据库

时间:2016-06-29 10:53:09

标签: android angularjs sqlite cordova ionic-framework

我正在尝试将一些数据存储在我的离子应用程序的sqlite数据库中。我正在使用以下代码创建数据库和一个表:

var db = null;

angular.module('starter', ['ionic', 'starter.controllers', 'ngCordova', 'slick'])

.run(function($ionicPlatform, $cordovaSQLite) {
  $ionicPlatform.ready(function() {
    if (window.cordova && window.cordova.plugins.Keyboard) {
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
      cordova.plugins.Keyboard.disableScroll(true);
    }
    if (window.StatusBar) {
      StatusBar.styleDefault();
    }
    if (window.cordova) {
      db = $cordovaSQLite.openDB({ name: "kog.db" });
      $cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS teams (id integer, title text, day text, fromtime text, totime text, location text)");
      console.log("android");    
     } else {
      db = window.openDatabase("kog.db", '1', 'kog', 1024 * 1024 * 100); // browser
      db.transaction(function (tx) {
         tx.executeSql('CREATE TABLE IF NOT EXISTS teams (id integer, title text, day text, fromtime text, totime text, location text)');
      });
      console.log("browser");
    }
  });
})

当我测试我的应用时,不会创建数据库。我的移动设备上没有使用SQLite插件,也没有使用window.openDatabase在Chrome中测试应用程序。

任何建议,我做错了什么?

感谢您的帮助! 卡拉

2 个答案:

答案 0 :(得分:0)

控制器中的$ cordovaSQLite代码应该位于离子就绪函数或deviceready函数中(设备就绪函数首选,因为离子就绪函数有时不会触发)否则我已经看到它给出错误。

您使用openDB的方法是正确的,它位于run函数中。虽然理想情况下它也应该有一个try catch语句。

为了更清晰,请查看我的存储库的www / index.html和www / js / app.js文件。

回购时间为https://github.com/vibhutewary/ionic_ngcordova_sqlite_todo

您将在示例中的“platforms / android / build / outputs”文件夹中找到已构建的apk。我在下载代码后测试了“离子运行android”命令,它运行正常。

上述应用程序的版本2位于我的github帐户的“ionic_ngcordova_sqlite_todos_version_2”存储库中。 它具有相同的功能,但使用了Ionic Framework的实践(改进的CSS等)。

另外我建议使用alert()函数来检查openDB成功函数中的代码是否正在执行。这可以在try catch语句中。

好的更新:我在这里分享了一个关于openDB和INSERT,SELECT的简单例子的链接。它使用alert来通知是否创建了db,然后在插入值时发出警报。然后它使用SELECT语句警告插入的值。

请参阅www / index.html和www / js / app.js文件以获取代码。 git存储库位于https://github.com/vibhutewary/ionic_ngcordova_sqlite_creatdb_insert_select

我已下载“ionic_ngcordova_sqlite_creatdb_insert_select”存储库并运行“ionic run android”并且它可以正常工作。存储库已经在“/ platforms / android / build / outputs”文件夹中创建了一个apk(这将在“ionic run android”命令中覆盖)。这里的示例创建一个DB,然后在控制器中,在表中插入测试消息,然后使用alert()来显示表中的SELECT结果。

要检查是否已创建数据库,可以使用checkFile方法。

您可以看到上面的“ionic_ngcordova_sqlite_creatdb_insert_select”存储库的www / js / app.js文件,因为它调用了“cordova.file.applicationStorageDirectory”方法。

请注意,数据库位于此“applicationStorageDirectory”文件夹中名为“databases”的文件夹中。

您还可以参考这篇文章,其中显示了applicationStorageDirectory的用法:Sqlite: check if database exist

编辑:我已经看到Ionic Framework在启动时在某些手机上崩溃(在手机上测试“PHICOMM C630”),所以我删除了Ionic Framework并且只包含了ngCordova和AngularJS库。最终的解决方案是在我的名为“corodova_ngcordova_angularjs_jquerymobile_todos”的存储库中。它是一个使用SQLite DB处理的Todo应用程序。要在不构建的情况下运行解决方案,请键入“cordova run android”

答案 1 :(得分:0)

您的代码在创建设备数据库时有两个错误,一个在浏览器创建数据库时出错。下面是两者的解决方案

某些Android设备限制使用位置参数和数据库名称。所以提供Location参数 改变这一行

db = $cordovaSQLite.openDB({ name: "kog.db" }); 

db = $cordovaSQLite.openDB({ name: "kog.db", location : 1 });

并且对于浏览器支持,您需要更改这些行

db = window.openDatabase("kog.db", '1', 'kog', 1024 * 1024 * 100); // browser
      db.transaction(function (tx) {
         tx.executeSql('CREATE TABLE IF NOT EXISTS teams (id integer, title text, day text, fromtime text, totime text, location text)');
      });

$cordovaSQLite.execute(db, 'CREATE TABLE IF NOT EXISTS teams (id integer, title text, day text, fromtime text, totime text, location text)');