【问题标题】:SQLite in Ionic 3 getting data null after navigate to another page导航到另一个页面后,Ionic 3 中的 SQLite 获取数据为空
【发布时间】:2018-06-17 22:02:06
【问题描述】:

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

这是我的数据库提供者

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 但数据为空。

【问题讨论】:

  • 你的意思是变量“数据”还是“数据”的单个成员为空?您是否手动检查过 SQL?即使 db 为空,getUser() 中的“COUNT(*)”也会创建行。
  • 对不起,我的意思是数据的单个成员。当我调用此data[0].username 时,我总是得到 null

标签: sqlite typescript ionic3


【解决方案1】:

问题下的评论似乎有帮助,所以我将其作为答案,希望能收集一些声誉积分。

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

在执行 promise 回调之前调用函数“getUser”。

【讨论】:

  • 我不明白这个“在执行承诺回调之前调用函数“getUser”。”。请解释一下promise回调?
猜你喜欢
  • 2022-01-09
  • 1970-01-01
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多