2017-01-15 14 views
0

私はsqliteによって動力を与えられるデータベースサービスを備えたイオン2アプリを持っています。データベースには、2行の項目が格納されます。アプリの最初のページにこれらの項目が表示されます。私が実行している問題は、サービスがデータベースをロードする前にページがアイテムをロードしようとしていることです。私はこのエラーを取得する:データベース準備完了後にsqliteからIonic2ロード行

Cannot read property 'executeSql' of undefined

私は別のページに移動し、家に帰っに、それが正常にロードする場合。これはデータベースサービスです。最初のページでgetScanablesを呼び出そうとしています。

import { Injectable } from '@angular/core'; 
import {SQLite} from 'ionic-native'; 
import {Platform} from 'ionic-angular'; 

@Injectable() 
export class Database { 

    private storage: SQLite; 
    public isOpen: boolean; 

    public constructor(private platform: Platform,) { 
     console.log('Creating storage.'); 
     platform.ready().then(() => { 
      console.log('Platform Ready.'); 
      if(!this.isOpen) { 
       console.log('Database Unopened'); 
       this.storage = new SQLite(); 
       this.storage.openDatabase({name: "data.db", location: "default"}).then(() => { 
        console.log('Generating Database'); 
        this.storage.executeSql("CREATE TABLE IF NOT EXISTS scanables (id INTEGER PRIMARY KEY AUTOINCREMENT, value TEXT, type TEXT, name TEXT, date TEXT)", []); 
        //this.storage.executeSql("CREATE TABLE IF NOT EXISTS journal (id INTEGER PRIMARY KEY AUTOINCREMENT, role TEXT, descriptors TEXT, image TEXT, behaviors TEXT)", []); 
        console.log('Generated.'); 
        this.isOpen = true; 
       }, (error) => { 
        console.log("Error opening database.", error); 
       }); 
      } 
     }); 
    } 

    public getScanables() { 
     console.log('Getting Scanables'); 
     return new Promise((resolve, reject) => { 
      this.storage.executeSql("SELECT * FROM scanables", []).then((data) => { 
       let journal = []; 
       if(data.rows.length > 0) { 
        for(let i = 0; i < data.rows.length; i++) { 
         journal.push({ 
          id: data.rows.item(i).id, 
          value: data.rows.item(i).value, 
          type: data.rows.item(i).type, 
          name: data.rows.item(i).name, 
          date: data.rows.item(i).date, 
          letter_one: data.rows.item(i).name.substring(0,1) 
         }); 
        } 
       } 
       resolve(journal); 
      }, (error) => { 
       reject(error); 
      }); 
     }); 
    } 

    ... 

} 

これは、最初のページに関連するコードです:

@Component({ 
    templateUrl: 'journal.html' 
}) 
export class JournalPage implements AfterViewInit { 
    public orderType: string = 'delivery'; 
    public autocomplete: {term: string, place: any}; 
    public regions: any; 
    public itemList: Array<Object>; 
    public addList: Array<number>; 

    constructor(private navCtrl: NavController, 
       private menu: MenuController, 
       private modalCtrl: ModalController, 
       private database: Database,  
       public userService: UserService, 
       private helper: Helper,       
       private l: LoggerService) { 

     this.itemList = [];  
     this.addList = [1,2,3,4,5,6,7];   
    } 

    ngAfterViewInit(): any { 
     console.log('journal.ngAfterViewInit'); 
     this.load(); 
    } 

    public load() { 
     console.log('journal.load'); 
     this.database.getScanables().then((result) => { 
      console.log('entered getScanables'); 
      this.itemList = <Array<Object>> result; 
      console.log('itemList', this.itemList); 
     }, (error) => { 
      this.l.error('journal.ts:', error); 
     }); 
    } 

    ... 

答えて

0

この問題の解決策は、サービスのデータベースパブリック変数にすると負荷にデータベースをロードすることでした。その後、データベースをロードした後にのみ、ルートページを設定しました。これにより、データベースが最初にロードされます。しかし、理想的な解決策ではないかもしれませんので、追加の回答を投稿してください。

関連する問題