ionic cordovaSQLite 插件在物理设备上不起作用

Posted

技术标签:

【中文标题】ionic cordovaSQLite 插件在物理设备上不起作用【英文标题】:ionic cordovaSQLite plugin doesn't work on physical device 【发布时间】:2015-02-21 08:58:34 【问题描述】:

我想在 ionic 中将 SQLite 数据添加到我的移动应用程序中,我已按照以下站点 https://blog.nraboy.com/2014/11/use-sqlite-instead-local-storage-ionic-framework/ 中的教程逐步进行操作,但它仍然无法在物理设备上运行,请提供任何建议。 在 index.html 我把下面的代码 `

<script src="lib/ionic/js/ionic.bundle.js"></script>

<script src="lib/ionic/js/angular-ui/angular-ui-router.js"></script>
<script src="lib/ionic/js/angular/angular-resource.js"></script>



<!-- Needed for Cordova/PhoneGap (will be a 404 during development) -->
<script src="js/app.js"></script>
<script src="js/ng-cordova.min.js"></script>
<script src="cordova.js"></script>`  

在我的 app.js 中,我首先编写了以下代码

     var db=null;
     var myApp=angular.module('myApp',['ionic','ngCordova'])
    .run(function($ionicPlatform, $cordovaSQLite) 
     $ionicPlatform.ready(function() 
    if(window.cordova && window.cordova.plugins.Keyboard) 
        cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);
    
    if(window.StatusBar) 
        StatusBar.styleDefault();
    

    db = $cordovaSQLite.openDB("test.db");
    $cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS people (id integer primary key, firstname text, lastname text)");
    console.log("hello");
)

)

所以我创建了一个名为 people 的表,并在我的登录控制器中将一行插入到 people 表中

controller('loginController',function($scope,$cordovaSQLite)

    var query = "INSERT INTO people (id,firstname, lastname) VALUES (?,?,?)";
    $cordovaSQLite.execute(db, query, [1,"khaled", "omar"]).then(function(res) 
        $scope.name=res.insertId;
    , function (err) 
        $scope.name="error";
    );

在 login.html 中我写了 name 但是当我在浏览器上运行它时出现以下错误无法读取未定义的属性“openDatabase”,我在物理设备上运行它但仍然无法工作

【问题讨论】:

我不认为你会得到这么多信息的任何答案。您可能应该显示您的代码、预期内容、错误等。 好的,我写了细节,谢谢你的建议 很高兴您使用了我的教程!如果您仔细查看db = $cordovaSQLite.openDB("test.db");,您会发现这是不正确的。参数不是字符串。它必须是一个对象。试着把 name: "test.db" 放在那里,让我们知道它是怎么回事。 @Nic:在你的教程中你写的是“test.db”而不是对象。哪个是正确的? 我相信 API 发生了变化,您想使用字符串,而不是对象。 【参考方案1】:

代码运行良好,错误似乎来自控制器中的问题。

【讨论】:

【参考方案2】:

下面的代码对我有用。

我不知道为什么,但是您必须将数据库创建代码放在 onReady 方法中,然后放在 if 语句之前,如下所示:

.run(function($ionicPlatform,$cordovaSQLite) 
  $ionicPlatform.ready(function()   

    db = $cordovaSQLite.openDB(name:"my.db", location:1);              
          $cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS testTable(id integer primary key, col1 text,col2 tex)");

    if(window.cordova && window.cordova.plugins.Keyboard) 
      // Hide the accessory bar by default (remove this to show the accessory bar above the keyboard
      // for form inputs)
      cordova.plugins.Keyboard.hideKeyboardAccessoryBar(true);

      // Don't remove this line unless you know what you are doing. It stops the viewport
      // from snapping when text inputs are focused. Ionic handles this internally for
      // a much nicer keyboard experience.
      cordova.plugins.Keyboard.disableScroll(true);
    
    if(window.StatusBar) 
      StatusBar.styleDefault();
                            
  );

【讨论】:

【参考方案3】:

您应该使用以下代码。

db = $cordovaSQLite.openDB(name: "dbname.db", location: 1);

它会起作用的。

【讨论】:

【参考方案4】:

$ionicPlatform.ready() 必须先触发,然后才能使用cordova。

【讨论】:

【参考方案5】:

这确实有效,感谢musakkhir 和anuj

db = $cordovaSQLite.openDB(name: "dbname.db", location: 1);

location:1 很重要。

【讨论】:

以上是关于ionic cordovaSQLite 插件在物理设备上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Ionic/Cordova SqLite 并不总是在来自 Play 商店的应用更新之间持续存在

如何在 IONIC 3 物理设备上运行我的应用程序

ionic痛点:Android真机物理返回按钮问题!GitHub问题归纳

Cordova SQLite - 从一系列 SELECT 查询中获取结果

Ionic2使用第三方cordova插件(非Ionic2官方支持的native cordova插件)

原生态ionic-native插件