Ionic 3中的SQLite在导航到另一个页面后获取数据为null

时间:2018-01-08 21:47:06

标签: sqlite typescript ionic3

请帮帮我。我已经使数据库提供程序与离子3中的SQLite连接。当我想获取数据行时,它总是变为空但是当我检查数据长度时它有1

这是我的DatabaseProvider

import { Injectable } from '@angular/core';
import { Platform } from 'ionic-angular';
import { SQLite, SQLiteObject } from '@ionic-native/sqlite';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Storage } from '@ionic/storage';

@Injectable()
export class DatabaseProvider {
    private db: SQLiteObject;
    private databaseReady: BehaviorSubject<boolean>;

    constructor(private storage: Storage, private sqlite: SQLite, private platform: Platform) {
        this.databaseReady = new BehaviorSubject(false);
        this.platform.ready().then(() => {
            this.sqlite.create({
                name: 'takia.db',
                location: 'default'
            }).then((database: SQLiteObject) => {
                this.db = database;
                this.storage.get('database_filled').then(val => {
                    if (val) {
                        this.databaseReady.next(true);
                    } else {
                        this.initDB();
                    }
                });
            }).catch(e => { console.log(e); });
        });
    }

    initDB(){
        this.db.executeSql('CREATE TABLE IF NOT EXISTS users(user_id INTEGER PRIMARY KEY, username TEXT, email TEXT, password TEXT)', {})
        .then(res => {
            this.db.executeSql('INSERT INTO users VALUES(NULL,?,?,?,?)',['admin','admin.@email.com','password'])
            .then(res => {
                this.databaseReady.next(true);
                this.storage.set('database_filled', true);
            }).catch(e => {
                console.log(e);
            });
        }).catch(e => {
            console.log(e)
        });

        this.db.executeSql('CREATE TABLE IF NOT EXISTS questions(user_id INTEGER PRIMARY KEY, username TEXT, email TEXT, password TEXT)', {})
        .then(res => {
            this.db.executeSql('INSERT INTO users VALUES(NULL,?,?,?,?)',['admin','admin.tazkiaiibs.sch.id','bismillah'])
            .then(res => {
                this.databaseReady.next(true);
                this.storage.set('database_filled', true);
            }).catch(e => {
                console.log(e);
            });
        }).catch(e => {
            console.log(e)
        });
    }

    getUser(){
        return this.db.executeSql('SELECT user_id, username, email, password, COUNT(*) total FROM users', [])
        .then(res => {
            let users = [];
            if (res.rows.length > 0) {
                for (var i = 0; i < res.rows.length; i++) {
                    let row = res.rows.item(i);
                    users.push(row);
                }
            }
            return users;
        }, err => {
            console.log('Error: ', err);
            return [];
        });
    }

    getDatabaseState() {
        return this.databaseReady.asObservable();
    }

}

这是我在组件中的代码

  constructor(public navCtrl: NavController, 
              public navParams: NavParams,
              private dbProvider: DatabaseProvider,
              private toastCtrl: ToastController) {
    this.loadData();
  }

  loadData(){
    this.dbProvider.getUser().then(data=>{
        if(data.length>0){
            this.id = data[0].id;
            this.old_password = data[0].password;
            this.username = data[0].username;
            this.email = data[0].email;
            let toast = this.toastCtrl.create({
                message: 'ID '+data[0].username,
                duration: 3000
            });
            toast.present();
        }else{
            let toast = this.toastCtrl.create({
                message: 'No data'+data.length,
                duration: 3000
            });
            toast.present();
        }
    }); 
  }

当我运行loadData函数时,长度不为0,但数据为空。

1 个答案:

答案 0 :(得分:0)

该问题下的评论似乎有所帮助,因此我将其形成为希望收集一些声誉点的答案。

问题似乎是错误的SQL查询。 count(*)部分使查询返回至少一行。因此,在将数据添加到数据库之前查询时,其他字段可能为NULL。

功能&#34; getUser&#34;在执行promise回调之前调用。