2014-12-01 26 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