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

Posted

技术标签:

【中文标题】TypeError:无法读取未定义的属性“executeSql”【英文标题】:TypeError: Cannot read property ‘executeSql’ of undefined 【发布时间】:2018-04-18 13:14:39 【问题描述】:

我有一个 SQLite 提供程序 ("DatabaseProvider") 和一些读写方法 ("insertActivity em>”和“getData”)。

当我调用我的 insertActivity() 方法时,一切顺利; 但是当我调用 getData() 时,它给了我这个错误:

错误:

我不明白为什么,因为我认为方法是相同和我调用它们的 .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);
      );
    );
  


我在两个页面上使用它:“modal-add”和“stats”。

我的 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);
  (...)
  


还有我的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
  


有什么想法吗?

提前感谢您的帮助。

【问题讨论】:

你在哪里测试你的代码在模拟器或实际设备上。因为这个插件代码在模拟器中不起作用。 我正在虚拟机上的 android-x86 上对其进行测试。它确实在数据库上正确写入但无法读取,不知道问题出在哪里。 是的,在构造函数中作为参数的命名不同,但根本没有区别(它们每个都是 DatabaseProvider 实例)......也尝试使用相同的名称,但没有运气。 (感谢您的回复) console.log(this.storage) 在调用这两个函数之前。看看同一个对象是同时被安慰还是不同。 试过:都是[object Object]。不知道。 【参考方案1】:

已解决:我犯了一些糟糕的菜鸟错误。

我的提供者方法内部没有问题,经过一千次更改后,我恢复到它的初始结构:

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

新手尝试传递数据,因为 Promise obj 是一个普通函数。事实上,我必须在 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();
  );


如您所见,出于优先考虑,我不得不将 ionViewDidLoad() 替换为 ionViewDidEnter()。

谢谢你。

【讨论】:

以上是关于TypeError:无法读取未定义的属性“executeSql”的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:无法读取未定义的属性“findAll”(expressjs)

TypeError:无法读取未定义的属性(读取“问题”)

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

TypeError:无法读取未定义的属性(读取“匹配”):

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

TypeError:无法在 gitlab 中读取未定义的属性(读取“读取”)