4

I'm using Ionic 2 (Angular 2) for a Hybrid app. I inject a shared provider into the page that will display data from my SQLite3 database and then proceed to load the data. However, on creation of my database provider opening the database takes some time (very little). My code (as of this moment) however does not wait for the database to be opened before querying, which obviously results in an error.

How can I structure my code that it will wait for the database to be opened in order to evade a crash?

The constructor of my database provider:

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');

This provider gets injected into the constructor of my page.

When the page (home page) is loaded it triggers an event that calls a load() function.

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

The load function:

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

I'm very much hoping someone can point me in the right direction :)

2
  • Any news here? I am facing the same problem. Commented Jan 24, 2017 at 13:29
  • @dermoritz I've resolved this problem and added my solution as an answer :) Commented Mar 8, 2017 at 18:17

1 Answer 1

4

I've finally found a solution to my problem.

For starters I've added a function to my provider that checks if the database is loaded, if it isn't it proceeds to load it:

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);
      });
    });
  }
});}

As this function returns a promise (JS Promises) it allows me to wait for the database to be opened before doing anything else (such as querying).

My function in the page-specific TypeScript file:

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

With code like this I never have problems with queries being performed before my database has been opened!

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.