简体   繁体   English

TypeError:无法读取未定义的属性“executeSql”

[英]TypeError: Cannot read property ‘executeSql’ of undefined

I've got a SQLite provider (" DatabaseProvider ") with some read and write methods (" insertActivity " and " getData ").我有一个带有一些读写方法(“ insertActivity ”和“ getData ”)的SQLite 提供程序(“ DatabaseProvider ”)。

When I call my insertActivity() method all goes well;当我调用我的insertActivity()方法时,一切顺利; but when I call getData() it gives me this error:但是当我调用getData()它给了我这个错误:

ERROR: TypeError: Cannot read property 'executeSql' of undefined错误:TypeError:无法读取未定义的属性“executeSql”

I can't understand why, because I think methods are identical and .ts files from where I call them, too.我不明白为什么,因为我认为方法是相同的,而且 .ts 文件也是我调用它们的地方。

Here's my database.ts :这是我的database.ts

import { Injectable } from '@angular/core';
import { SQLite, SQLiteObject } from '@ionic-native/sqlite';
import { Http } from '@angular/http';
import 'rxjs/add/operator/map';

@Injectable()
export class DatabaseProvider {
  // private storage:  SQLite;
  public db:       SQLiteObject;
  public isOpen:   boolean;
  public storage:  any;

  constructor(
    public http:      Http,
    public database:  SQLite,

  ) {

    if (!this.isOpen) {
        // create db and tables

          this.database = new SQLite();
          this.database.create({name: 'RLSDB', location: 'default'})
          .then((db: SQLiteObject) => {
            this.storage = db;
            db.executeSql('create table if not exists LOGIN (id INTEGER PRIMARY KEY AUTOINCREMENT, sid TEXT, username TEXT, password TEXT, email TEXT, timestamp TEXT)', {}).then((data) => {
              this.isOpen = true;
              console.log('TABLE CREATED: ', data);
            }, (error) => {
              console.error("Unable to execute sql", error);
            });
          }).then(() => {
            this.storage.executeSql('create table if not exists ACTIVITIES (id INTEGER PRIMARY KEY AUTOINCREMENT, activity_name TEXT, activity_datetime TEXT)', {});
            this.isOpen = true;
          }
        );
    }
  }

  public getData() {

    return new Promise((resolve, reject) => {
      this.storage.executeSql('SELECT * from ACTIVITIES', []).then((data) => {
        let activityValues = [];
        if (data.rows.length > 0) {
          for(let i=0; i <data.rows.length; i++) {
            activityValues.push(data.rows.item(i).activity_datetime);
          }
        }
        return resolve(data);
    }, (error) => {
      return reject(error);
    });
  });


  }

  public insertActivity(
    RLSActivity: string,
    RLSActivityDatetime: any ) {
      return new Promise((resolve, reject) => {
        this.storage.executeSql("INSERT INTO ACTIVITIES (activity_name, activity_datetime) VALUES (?, ?)", [RLSActivity, RLSActivityDatetime]).then((data) => {
          return resolve(data);
      }, (error) => {
        return reject(error);
      });
    });
  }

}

I use it on two pages: " modal-add " and " stats ".我在两个页面上使用它:“ modal-add ”和“ stats ”。

my modal-add.ts , which works perfectly :我的modal-add.ts效果很好

import { Component } from '@angular/core';
import { NavController  } from 'ionic-angular';
import { IonicPage, NavParams, ViewController } from 'ionic-angular';
import { DiaryPage } from '../diary/diary';
import {Validators, FormBuilder, FormGroup } from '@angular/forms';
import { DatabaseProvider } from '../../providers/database/database';

@IonicPage()
@Component({
  selector: 'page-modal-add',
  templateUrl: 'modal-add.html',
})
export class ModalAddPage {

  private activityForm: FormGroup;

  constructor(
    public navParams: NavParams,
    private view: ViewController,
    private navCtrl: NavController,
    private formBuilder: FormBuilder,
    public database: DatabaseProvider
  ) {
    this.activityForm = this.formBuilder.group({
          title: [''],
          date: [''],
        });

   }

  closeModal(){

    const inputData = {
      title: this.activityForm.value.title,
      date: this.activityForm.value.date,
    };

    this.database.insertActivity(inputData.title, inputData.date);
  (...)
  }

}

and my stats.ts , which returns error :和我的stats.ts它返回错误

import { Component, ViewChild } from '@angular/core';
import { IonicPage, NavController, NavParams } from 'ionic-angular';
import { DiaryPage } from '../diary/diary';
import { DatabaseProvider } from '../../providers/database/database';
import { Chart } from 'chart.js';

@IonicPage()
@Component({
  selector: 'page-stats',
  templateUrl: 'stats.html'
})
export class StatsPage {

  @ViewChild('lineCanvas') lineCanvas;

  lineChart: any;
  events: any;

  constructor(
    public navCtrl: NavController,
    public navParams: NavParams,
    private db: DatabaseProvider
  ) {

  } 

  ionViewDidLoad() {

    this.events = this.db.getData();
    this.lineChart = new Chart(this.lineCanvas.nativeElement, {
     (...) // stuff to create a chart
  }

}

Any ideas?有任何想法吗?

Thank you in advance for your help.预先感谢您的帮助。

Solved: I've done some bad noob mistakes.已解决:我犯了一些糟糕的菜鸟错误。

There were no problems inside my provider method and after a thousand changes I reverted to its initial structure:我的提供者方法内部没有问题,经过一千次更改后,我恢复到其初始结构:

public getData() {

  return new Promise((resolve, reject) => {
    this.storage.executeSql('SELECT * from ACTIVITIES', []).then((data) => {
      let activityValues = [];
      if (data.rows.length > 0) {
        for(let i=0; i <data.rows.length; i++) {
          activityValues.push(data.rows.item(i).activity_datetime);
        }
      }
      // alert(activityValues); // contains data
      resolve(activityValues);
    }, (error) => {
      reject(error);
    })
  });
}

The newbie thing was the attempt to pass data as the Promise obj were a normal function.新手的事情是尝试传递数据,因为 Promise obj 是一个正常的函数。 In fact I had to use .then() in my stats.ts :事实上,我不得不在stats.ts 中使用 .then ()

ionViewDidEnter() {

  this.db.getData().then( res => {

      this.events = res;

      // some new stuff below
      this.lineChart.config.data.labels = this.events;
      this.lineChart.update();
  });

}

and as you can see, I had to substitute ionViewDidLoad() with ionViewDidEnter() for priority reasons.如您所见,出于优先考虑,我不得不将 ionViewDidLoad() 替换为 ionViewDidEnter() 。

Thank you SO.谢谢你这么。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 未捕获(承诺):TypeError:无法读取未定义的属性“ executeSql” - Uncaught (in promise): TypeError: Cannot read property 'executeSql' of undefined TypeError:无法读取未定义的属性'of' - TypeError: Cannot read property 'of' of undefined “TypeError:无法读取属性&#39;然后&#39;未定义 - "TypeError: Cannot read property 'then' of undefined 错误TypeError:无法读取未定义的属性“ property” - ERROR TypeError: Cannot read property 'property' of undefined typeError:无法读取未定义的属性&#39;tigerStart&#39; - typeError: Cannot read property 'tigerStart' of undefined 错误TypeError:无法读取未定义的属性&#39;basemapLayer&#39; - ERROR TypeError: Cannot read property 'basemapLayer' of undefined 类型错误:无法读取未定义的属性“getPosts” - TypeError: Cannot read property 'getPosts' of undefined Angular 2 EXCEPTION:TypeError:无法读取未定义的属性“0” - Angular 2 EXCEPTION: TypeError: Cannot read property '0' of undefined 业力TypeError“无法读取未定义的属性&#39;subscribe&#39;” - karma TypeError “Cannot read property 'subscribe' of undefined” 错误TypeError:无法读取未定义的属性“填充” - ERROR TypeError: Cannot read property 'fill' of undefined
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM