【问题标题】:Ionic2/Angular2 wait for SQLite database to open before queryingIonic2/Angular2 在查询之前等待 SQLite 数据库打开
【发布时间】:2017-03-24 05:16:05
【问题描述】:

我将 Ionic 2 (Angular 2) 用于混合应用程序。我将一个共享提供程序注入到将显示来自我的 SQLite3 数据库的数据的页面中,然后继续加载数据。但是,在创建我的数据库提供程序时,打开数据库需要一些时间(很少)。但是,我的代码(截至目前)在查询之前没有等待数据库打开,这显然会导致错误。

如何构建我的代码以等待数据库打开以规避崩溃?

我的数据库提供者的构造函数:

constructor(private platform: Platform) {
this.platform.ready().then(() => {
  if(this.isOpen !== true) {
    this.storage = new SQLite();

    this.storage.openDatabase({name: "data.db", location: "default"}).then(() => {
      this.isOpen = true;
      this.storage.executeSql("CREATE TABLE IF NOT EXISTS people (id INTEGER PRIMARY KEY AUTOINCREMENT, firstname TEXT, lastname TEXT)", []);
    });
  }
});
console.log('Hello Database Provider');

此提供程序被注入到我的页面的构造函数中。

当页面(主页)被加载时,它会触发一个调用load()函数的事件。

ionViewDidLoad() {
this.load();
console.log('Hello Home Page'); 

加载函数:

public load() {
this.database.getPeople().then((result) => {
  this.itemList = <Array<Object>> result;
}, (error) => {
  console.log("LOAD ERROR: ", error);
});

我非常希望有人能指出我正确的方向:)

【问题讨论】:

  • 这里有什么消息吗?我也面临同样的问题。
  • @dermoritz 我已经解决了这个问题并添加了我的解决方案作为答案:)

标签: sqlite angular ionic-framework ionic2


【解决方案1】:

我终于找到了解决问题的方法。

对于初学者,我已向我的提供程序添加了一个函数,用于检查数据库是否已加载,如果未加载,则继续加载它:

public openSQLiteDatabase() {
return new Promise((resolve, reject) => {
  if(this.isOpen) {
    console.log("DB IS OPEN");
    resolve(this.isOpen);
  }

  else {
    console.log("DB IS NOT OPEN");
    this.platform.ready().then(() => {
      this.storage.openDatabase({name: "data.db", location: "default"}).then(() => {
        this.appsettings.openSQLiteDatabase().then(() => {
          this.appsettings.getSettings().then((result) => {
            let settings: Settings = <Settings> result;
            this.selectedDataset = settings.selectedDataset;
            this.isOpen = true;
            resolve(this.isOpen);
          });
        });
      }, (error) => {
        reject(error);
      });
    });
  }
});}

由于此函数返回一个承诺 (JS Promises),它允许我在执行任何其他操作(例如查询)之前等待数据库打开。

我在页面特定的 TypeScript 文件中的函数:

ionViewDidLoad() {
this.database.openSQLiteDatabase().then(() => {
  this.loadDictionary();
});}

使用这样的代码,在打开我的数据库之前执行查询从来没有问题!

【讨论】:

    猜你喜欢
    • 2020-03-26
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2014-07-23
    • 1970-01-01
    相关资源
    最近更新 更多