2014-12-01 30 views
3

____ INTRO离子预填充数据库与Antair科尔多瓦SQLitePlugin [请求帮助]

大家好,首先,三点澄清:

  1. 我的英语不好,所以我求求你提前赦免我的错误,
  2. 我是新手,所以请原谅我的不准确,
  3. 我以前搜索过,并尝试过我在互联网上找到的解决方案,但仍无法解决嵌入预填充数据库的问题。

____

我想开发iOS和Android应用程序与预先填充数据库目标。

仅有例如,该数据库包括15.000记录每一个由三​​个关键值对(ID姓名姓氏)的。

___ 我做了什么

步骤:

ionic start myapp blank 
cd myapp 
ionic platform add ios 
ionic platform add android 

然后创建用于测试目的的SQLite数据库,名为mydb.sqlite,制成一张表包含两个编号名字姓氏记录。

我决定使用下面的插件:https://github.com/Antair/Cordova-SQLitePlugin 这是因为它可以用cordova工具安装。

ionic plugin add https://github.com/Antair/Cordova-SQLitePlugin 

警报:我认为网站上的说明显示不正确的引用 - “科尔多瓦插件添加https://github.com/brodysoft/Cordova-SQLitePlugin - 这是指另一个插件)。

然后,以下插件网站上的说明,我将数据库复制到的myapp/WWW/DB/,以便它可以在现在的myapp /WWW/DB/mydb.sqlite

找到我修改了的index.html包括SQLite的插件刚过默认app.js脚本:

<!-- your app's js --> 
<script src="js/app.js"></script> 
<script src="SQLitePlugin.js"></script> 

我也写一些代码行中在DEX。HTML文件显示一个按钮:

<ion-content ng-controller="MyCtrl"> 
    <button class="button" ng-click="all()">All</button> 
</ion-content> 

最后,我修改了./js/app.js

// Ionic Starter App 

var db = null; 

angular.module('starter', ['ionic' /* What goes here? */ ]) 

.run(function($ionicPlatform) { 
    $ionicPlatform.ready(function() { 
    // some predefined code has been omitted 

    window.sqlitePlugin.importPrepopulatedDatabase({file: "mydb.sqlite", "importIfExists": true}); 
    db = window.sqlitePlugin.openDatabase({name: "mydb.sqlite"}); 

    }); // $ionicPlatform.ready 
}) // .run 

.controller('MyCtrl', function($scope){ 

    $scope.all = function(){ 
      var query = "SELECT * FROM people"; 
      // I don't know how to proceed 

    }; // $scope.all 

}); // .controller 

___ 的问题

我不知道如何在控制器部分继续查询所有记录(只是查询的一个例子)并在console.log中显示结果。

我认为下面的代码必须以某种方式来完成:

angular.module('starter', ['ionic' /* What goes here? */ ]) 

而且还控制器部分中的代码必须完成:

 $scope.all = function(){ 
       var query = "SELECT * FROM people"; 
       // I don't know how to proceed 

     }; // $scope.all 

___ 最后感谢

预先感谢您提供给我的帮助。

回答

2

所以这家伙的代码已经帮助了很多封装我的DAL。我强烈建议你几乎逐字地使用他的代码。

https://gist.github.com/jgoux/10738978

你会看到他有以下方法:

self.query = function(query, bindings) { 
    bindings = typeof bindings !== 'undefined' ? bindings : []; 
    var deferred = $q.defer(); 

    self.db.transaction(function(transaction) { 
     transaction.executeSql(query, bindings, function(transaction, result) { 
      deferred.resolve(result); 
     }, function(transaction, error) { 
      deferred.reject(error); 
     }); 
    }); 

    return deferred.promise; 
}; 

让我们打破这一点。查询函数使用查询字符串(查询参数)和可能绑定的列表?在像“SELECT * FROM A_TABLE WHERE ID =?”的查询中。因为他的代码是一种服务,所以自我价值指向服务本身,以供将来的所有调用使用。该函数将针对数据库执行事务,但是它返回一个只有在数据库返回时才履行的承诺。

他的服务提供了第二个辅助函数:fetchAll。

self.fetchAll = function(result) { 
    var output = []; 

    for (var i = 0; i < result.rows.length; i++) { 
     output.push(result.rows.item(i)); 
    } 

    return output; 
}; 

fetchAll会将行整体读入数组中。 fetchAll的结果参数是在查询函数的承诺履行中传递的结果变量。

如果您将自己的代码复制并粘贴到您的服务文件中,则您现在拥有一个bonafide数据库服务。您可以将该服务包装在DAL中。这是我的项目的一个例子。

.service('LocationService', function ($q, DB, Util) { 
    'use strict'; 
    var self = this; 
    self.locations = []; 
    self.loadLocked = false; 
    self.pending = []; 

    self.findLocations = function() { 
     var d = $q.defer(); 
     if (self.locations.length > 0) { 
      d.resolve(self.locations); 
     } 
     else if (self.locations.length === 0 && !self.loadLocked) { 
      self.loadLocked = true; 
      DB.query("SELECT * FROM locations WHERE kind = 'active'") 
        .then(function (resultSet) { 
         var locations = DB.fetchAll(resultSet); 
         self.locations. 
          push.apply(self.locations, locations); 
         self.loadLocked = false; 
         d.resolve(self.locations); 
         self.pending.forEach(function (d) { 
          d.resolve(self.locations); 
         }); 
        }, Util.handleError); 
      } else { 
       self.pending.push(d); 
      } 

      return d.promise; 
     }; 
}) 

这个例子是一个有点吵,因为它有一些“线程”的代码,以确保如果同样的承诺被触发两次,它只能运行针对DB一次。一般的观点是显示DB.query返回一个promise。查询方法之后的“then”使用DB服务来获取所有数据并将其添加到我的本地内存空间中。所有这些都由返回变量d.promise的self.findLocations来协调。

您的代表将采用类似的方式。控制器可以让你的DAL服务,比如我的LocationService,由AngularJS注入它。如果您使用AngularJS UI,您可以让它解析数据并将其传递到列表中。

最后,我对这个人的代码唯一的问题是数据库应该来自这个代码。

var dbMaker = ($window.sqlitePlugin || $window); 

原因是该插件在Apache Ripple中不起作用。由于插件做了很好的工作镜像的浏览器的SQL接口,这个简单的小变化将使纹波来运行你的应用程序离子,同时还让你工作,你的SQLite在真实设备。

我希望这会有所帮助。

+0

我会尝试你的代码。非常感谢你。 – Gilberto 2014-12-02 19:14:37