【问题标题】:Ionic 3 Sqlite Returning NullIonic 3 Sqlite 返回空值
【发布时间】:2019-01-15 16:43:29
【问题描述】:

我试图在 Ionic 3 中读取我的 Sqlite 数据库,但返回的值始终为空。如果我在方法中console.log(data.rows.item(0).token),那么它会将正确的值记录到控制台,但不会将正确的值返回给调用代码。

这是我用来获取令牌的方法:

getToken() {
    //Open database
    this.openCreateDatabase()
      .then((db: SQLiteObject) => {
        //Execute select
        db.executeSql("SELECT token FROM Token WHERE id = 1", [])
          .then((data) => {
            //Get and return the token
            return data.rows.item(0).token;
          })
          .catch((e) => {
            //Log any errors
            console.log(JSON.stringify(e));
            return null;
          })
      });
  }

调用代码很简单:

ionViewDidEnter(){
  console.log(this.sql.getToken());
}

【问题讨论】:

    标签: javascript sqlite ionic-framework ionic3


    【解决方案1】:

    要获取令牌,您需要将 getToken 设为Promise

    openCreateDatabase之前添加return;

    getToken() {
        //Open database
        //
        return this.openCreateDatabase()
          .then((db: SQLiteObject) => {
            //Execute select
            db.executeSql("SELECT token FROM Token WHERE id = 1", [])
              .then((data) => {
                //Get and return the token
                return data.rows.item(0).token;
              })
              .catch((e) => {
                //Log any errors
                console.log(JSON.stringify(e));
                return null;
              })
          });
      }
    

    ionViewDidEnter 更改为:

    1.异步等待

    async ionViewDidEnter(){
     let token = await this.sql.getToken();
      console.log(token);
    }
    

    2。或Then

    ionViewDidEnter(){
         this.sql.getToken().then(token => {
    console.log(token)
         })
        .....
        }
    

    【讨论】:

    • 谢谢你 - 没有直接工作,但我确实将我的方法转换为 Promises,它们现在工作了。
    【解决方案2】:

    尝试创建一个方法局部变量或一个js文件全局变量并返回那个。像这样的:

    getToken() {
    //Open database
    this.openCreateDatabase()
      .then((db: SQLiteObject) => {
        //Execute select
        db.executeSql("SELECT token FROM Token WHERE id = 1", [])
          .then((data) => {
            //Get and return the token
            let val = data.rows.item(0).token;
            return val;
          })
          .catch((e) => {
            //Log any errors
            console.log(JSON.stringify(e));
            return null;
          })
      });
      }
    

    告诉我们这是否可行。

    【讨论】:

    • 不幸的是仍然返回 null
    • 从哪里调用 getToken() 方法?你的代码文件结构是什么?
    【解决方案3】:

    IftekharDani 通过提到承诺为我指明了正确的方向,尽管他的解决方案并没有直接起作用,但它帮助我开发了一个可以做到的解决方案。我最终得到的代码如下:

    getToken() {
        return new Promise((resolve, reject) => {
          this.openCreateDatabase()
            .then((db: SQLiteObject) => {
              db.executeSql("SELECT * FROM Token WHERE id = 1", [])
                .then((data) => {
                  let tokenValues = [];
                  if (data.rows.length > 0) {
                    for (let i = 0; i < data.rows.length; i++) {
                      tokenValues.push(data.rows.item(i).token);
                    }
                  }
                  resolve(tokenValues);
                }, (error) => {
                  reject(error);
                })
            });
        });
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-13
      • 2018-11-13
      • 2017-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多