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”的主要内容,如果未能解决你的问题,请参考以下文章