2014-12-01 1 views
3

____ INTROИонные заполняемых База данных с Antair Кордова SQLitePlugin [запросу помощь]

Привет всем, в первую очередь, три уточнения:

  1. Мой английский не очень хорошо, поэтому я прошу прошу прощения за мои ошибки,
  2. Я новичок, поэтому простите меня за неточности,
  3. Я ранее искал и пробовал решения, которые я нашел в Интернете, но все же я не могу решить проблему внедрения предварительно заполненной базы данных.

____ ЦЕЛЬ

Я хочу, чтобы разработать приложение для Android и прошивки с заполняемых базами данных.

Просто, например, база данных состоит из 15,000 записей каждого из трех ключей паров значений (идентификатора, ПгвЬЫата и LastName).

___ ЧТО Я СДЕЛАЛ

шагов:

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

Затем я создал базу данных SQLite для целей тестирования, названный mydb.sqlite, сделанный из одной таблицы людей, содержащих два id, фамилия, фамилия записей.

Я решил использовать следующий плагин: https://github.com/Antair/Cordova-SQLitePlugin Это потому, что он может быть установлен с инструментом cordova.

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

(Alert: Я думаю, что инструкции на веб-сайте показывают неверную ссылку - «Cordova плагин добавить https://github.com/brodysoft/Cordova-SQLitePlugin» - который относится к другому плагину).

Затем, следуя инструкциям на веб-сайте плагина, я скопировал базу данных для MYAPP/WWW/дб/ так что теперь можно найти на MYAPP/WWW/дб/mydb.sqlite

Я изменил index.html включая плагин SQLite только после того, как по умолчанию app.js скрипт:

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

Я также написать несколько строк кода в в декс.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 

___ FINAL БЛАГОДАРЯ

Благодарим вас за помощь, которую вы мне дадите.

ответ

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 =?». Поскольку код является сервисом, значение self указывает на саму службу для всех будущих вызовов. Функция будет выполнять транзакцию против db, но она возвращает обещание, которое выполняется только после возвращения db.

Его служба обеспечивает вторую вспомогательную функцию: 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 DB. Вы можете обернуть эту службу в 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.query возвращает обещание. «Затем», следуя методу запроса, использует службу БД для извлечения данных и добавления их в локальное пространство памяти. Все это координируется self.findLocations, возвращающим переменную d.promise.

С уважением, ваше имя. Контроллер мог бы иметь вашу DAL-услугу, такую ​​как мой LocationService, в нее вставляемый AngularJS. Если вы используете пользовательский интерфейс AngularJS, его можно разрешить и передать в список.

Наконец, единственная проблема, с которой я столкнулся с кодом парня, заключается в том, что db должен исходить из этого кода.

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

Причина в том, что плагин не работает в пределах пульсации Apache. Поскольку плагин выполняет прекрасное задание, отражающее интерфейс веб-интерфейса браузера, это простое небольшое изменение позволит Ripple запускать ваши Ionic Apps, все еще позволяя вам работать с вашим SQLite на реальном устройстве.

Надеюсь, это поможет.

+0

Я попробую ваш код. Большое спасибо. – Gilberto

Смежные вопросы