2014-12-01 5 views
3

____ 소개이온 미리 채워진 데이터베이스

안녕하십니까, 우선, 세 가지 해명 :

  1. 좋은 영어가 아닌 내, 그래서 나는 구걸 내 실수에 대해 사전에 뭐라구,
  2. 나는 초보자이므로 부정확 한 것을 용서합니다.
  3. 이전에 인터넷에서 찾은 솔루션을 검색하고 시도했지만 여전히 채워진 데이터베이스를 포함하는 문제는 해결할 수 없습니다.

____ 나는 미리 채워진 데이터베이스와 iOS 및 안드로이드에 대한 응용 프로그램을 개발하고자하는

목표.

다만, 예를 들면, 데이터베이스 기록 15.000 세 키 - 값 쌍 (ID, FIRSTNAME LASTNAME 및 )로 이루어지는 각 구성된다. 내가

단계를 한 일 ___

를 포함하는 하나 개의 테이블로 만든 mydb.sqlite 이름

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

그럼 내가 테스트 목적에 대한 SQLite는 데이터베이스를 생성, id, 첫 번째 이름, 레코드.

다음 플러그인을 사용하기로 결정했습니다. https://github.com/Antair/Cordova-SQLitePlugin 코드 막대 도구로 설치할 수 있기 때문입니다.

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

(경고 : - "코르도바 플러그인 https://github.com/brodysoft/Cordova-SQLitePlugin 추가" - 다른 플러그인을 의미하는 나는 웹 사이트의 지시가 잘못된 참조를 보여줄 생각).

다음, 플러그인 웹 사이트의 지침에 따라, 나는 MyApp를/www가로 데이터베이스를 복사

/DB 그래서/ 지금 MyApp를/www /에서 dB/mydb.sqlite

에서 찾을 수 있음 나는 또한에 에 몇 줄의 코드를 작성

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

: 나는 기본 스크립트를 app.js 직후 SQLite는 플러그인을 포함하여 index.html을 수정 덱스.

// 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 

___

내가 모르는 문제 : 나는 ./js/app.js을 수정했다

마지막으로
<ion-content ng-controller="MyCtrl"> 
    <button class="button" ng-click="all()">All</button> 
</ion-content> 

: HTML 파일은 단추를 표시합니다 컨트롤러 섹션에서 모든 레코드를 쿼리하는 방법 (쿼리 예제)을 수행하고 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 =?"와 같은 쿼리에서 그는 코드가 서비스이기 때문에 자체 값은 이후의 모든 호출에 대해 서비스 자체를 가리 킵니다. 이 함수는 db에 대해 트랜잭션을 실행하지만 db가 돌아 오면 충족되는 약속 만 반환합니다.

His 서비스는 두 번째 헬퍼 함수 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의 결과 param은 쿼리 함수의 약속 이행에서 전달 된 결과 변수입니다.

코드를 복사하여 서비스 파일에 붙여 넣으면 bonafide DB 서비스가 제공됩니다. DAL에서 해당 서비스를 포장 할 수 있습니다. 다음은 내 프로젝트의 예입니다. 이 같은 약속은 한 번만 DB에 대해 실행 두 번 해고 된 경우 확인하는 몇 가지 "스레딩"코드를 가지고 있기 때문에

.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가 약속을 반환한다는 것을 보여줍니다. 쿼리 메서드 다음의 "then"은 DB 서비스를 사용하여 데이터를 가져 와서 로컬 메모리 공간에 추가합니다. 이 모든 것은 self.findLocations가 d.promise 변수를 반환함으로써 조정됩니다.

당신을 대신 할 것입니다. 컨트롤러는 AngularJS가 내 LocationService와 같은 DAL 서비스를 삽입 할 수 있습니다. AngularJS UI를 사용하는 경우 데이터를 분석하여 목록에 전달할 수 있습니다.

마지막으로, 내가 녀석 코드와 관련된 유일한 문제는 db가이 코드에서 나온 것입니다.

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

이 이유는 Apache Ripple에서 플러그인이 작동하지 않기 때문입니다. 플러그인이 브라우저의 웹 SQL 인터페이스를 미러링하는 훌륭한 작업을 수행하기 때문에이 간단한 변경으로 Ripple은 실제 장비에서 SQLite를 작동하면서도 Ionic Apps를 실행할 수 있습니다.

이 정보가 도움이되기를 바랍니다.

+0

코드를 사용해 보겠습니다. 고맙습니다. – Gilberto

관련 문제