【问题标题】:Firebase Dynamic Querying using results of barcode scanner (Ionic 3 & Angularfire2)Firebase 动态查询使用条码扫描器(Ionic 3 和 Angularfire2)的结果
【发布时间】:2018-08-20 20:56:48
【问题描述】:

我有一个案例,我需要动态地检索特定书籍的结果。我想通过使用它的 ISBN 编号(下面以粗体突出显示)来检索该特定图书。这就是我的数据库的样子:

{
  "results" : 
  {
    "key1" : {
      "Character_Depth" : 4,
      "Dialogue" : 4,
      "Plot" : 5,
      "Theme" : 3,
      "Writing_Style" : 3,
      "bookName" : "Ionic",
      "isbnNumber" : "0123456789012"
    },
    "key2" : {
      "Character_Depth" : 4,
      "Dialogue" : 4,
      "Plot" : 4,
      "Theme" : 2,
      "Writing_Style" : 4,
      "bookName" : "Justin",
      "isbnNumber" : "036000291452"
    }
  }
}

在我深入研究代码之前,这里有一些我认为您需要了解的重要信息。我要专门做的是使用条形码扫描仪来扫描一本书的 ISBN 号。然后我想使用扫描的 ISBN 号从该数据库中动态检索结果。话虽如此,我需要以这样一种方式设计我的代码,即条形码扫描仪变量每次(每次扫描)都会更新为新的条形码编号(已经完成)。然后将该条形码编号输入到查询中(我仍然无法开始工作,是我需要帮助的),它根据该查询检索子节点号码。

我的代码:

import { Component } from '@angular/core';
import { IonicPage, NavController, NavParams, AlertController } from 'ionic-angular';
import { BarcodeScanner, BarcodeScannerOptions } from '@ionic-native/barcode-scanner';
import { AngularFireAuth } from 'angularfire2/auth';
import { AngularFireDatabase, AngularFireList } from 'angularfire2/database';
import { HomePage } from '../home/home';
import { Observable } from 'rxjs/Observable';

@IonicPage()
@Component({
  selector: 'page-login',
  templateUrl: 'login.html',
})
export class LoginPage {

  bookResults: Observable<any[]>;
  options: BarcodeScannerOptions;
  results: {};
  constructor(public navCtrl: NavController, 
              public navParams: NavParams, 
              private fire: AngularFireAuth, 
              private database: AngularFireDatabase, 
              private barcodeScanner: BarcodeScanner, 
              private alertCtrl: AlertController) {

/* ########## part of the code where I specifically need help ########## */
        this.bookResults = this.database.list('results').valueChanges();
  }

/* ########### Barcode scanner function */
  async Scan(){
    this.results = await this.barcodeScanner.scan();
    console.log(this.results);
  }

}

现在,"this.bookResults = this.database.list('results').valueChanges();" 检索到上述数据库。但是,我需要一些关于如何更改查询的指导,以便我可以根据每个子节点的“isbnNumber”实例检索特定的子节点。

我已经尝试了几件事。最近我尝试过:

 this.bookResults = this.database.list('/results', {
 query: {
    orderByChild: isbnNumber,
    equalTo: this.results,
    }
 });

但这没有用。我尝试过其他方法,例如:

 this.bookResults = 
 this.database.list('/results/${this.results}').valueChanges();

但它也没有奏效。

我已经阅读了各种 stackoverflow 线程,所以如果这被标记为重复,我不会感到惊讶。我尝试按照各种线程的说明进行操作,但我觉得从数据库中检索信息的方式并不特别适用于我目前的情况,因为这些值用于检索硬编码到查询中的特定子节点。我需要一个动态变化的查询,它会根据条形码扫描仪的结果自行调整)。

如果这篇文章有任何不清楚的地方,请告诉我,我非常乐意提供帮助。另外,如果您有兴趣查看源代码,这里是包含它的我的 github 存储库的链接:

https://github.com/islamaymansais/honey_scanner (转到 src -> pages -> login -> login.ts)

感谢您花时间阅读这篇长文。我是初学者,我已经浏览了很多帖子,但不幸的是,由于我缺乏使用 ionic 的经验,我无法应用适当的更改。

【问题讨论】:

  • 非常感谢您的回复!我试过你的建议,应用程序崩溃了。这是它给我的错误:“无法读取未定义类型错误的属性'文本'”所以我将代码更新为: async Scan(){ this.results = await this.barcodeScanner.scan(); this.results = this.results['text'] } 然后在您的代码中我将其更新为: this.bookResults = this.database.list('/results', ref => (typeof this.results != "undefined" && this.results != "") ? ref.orderByChild('isbnNumber').equalTo(this.results) : ref ).snapshotChanges();
  • 但是,我没有得到任何结果。我不确定这是否是我的 html 的查询本身无效的问题。终端显示“consol.warn: FIREBASE WARNING: Invalid query string segment:” 在我的 HTML 中,我使用它来演示结果:

    Book Name: {{results.bookName}}

  • 您认为这是 HTML 的问题吗?我已经更新了我的 git 存储库,以便您可以查看该特定页面,如果您想完整而清晰地查看代码链接到 repo 的部分:github.com/islamaymansais/honey_scanner/tree/master/src /pages/... 我将此页面命名为“登录”,但我可能应该更改名称以使其不那么混乱。但是,这是您感兴趣的页面。
  • 我刚刚尝试重新运行我的更新,这就是我得到的结果:'{}' 类型的参数不可分配给'string |号码 |布尔值'。类型“{}”不可分配给类型“false”。更具体地说,突出显示的错误是更新代码的“.equalTo(this.results)”组件:this.bookResults = this.database.list('/results', ref => (typeof this.results != "undefined " && this.results != "") ? ref.orderByChild('isbnNumber').equalTo(this.results) : ref ).snapshotChanges();请指教
  • this.results.text 将包含扫描的条码 isbn 图书的编号。您将条形码扫描结果保存在结果对象中。您需要将其传递给查询以获取特定的 firebase 数据库对象。我将编辑我的帖子以使其更清晰。

标签: firebase ionic-framework ionic3 barcode angularfire2


【解决方案1】:

根据 Angular firebase 库的自述说明,以下内容应该可以工作:

constructor(public navCtrl: NavController, 
          public navParams: NavParams, 
          private fire: AngularFireAuth, 
          private database: AngularFireDatabase, 
          private barcodeScanner: BarcodeScanner, 
          private alertCtrl: AlertController) {
   this.getData();
}


async function Scan(){
   this.results = await this.barcodeScanner.scan();
   console.log(this.results);
   this.getData();
 }

this.getData = () => {
  var scanned_Barcode_Text = "";
  if (Object.keys(this.results).length > 0){
     if(typeof this.results['text'] != 'undefined' && this.results['text'] != ""){
      scanned_Barcode_Text = this.results['text'];
     }
   }


  this.bookResults = this.database.list('/results', 
        ref => (scanned_Barcode_Text != "") ? ref.orderByChild('isbnNumber').equalTo(scanned_Barcode_Text) : ref
  ).snapshotChanges();
}

在构造函数和条码扫描成功函数中调用getData()函数。

orderBy 和 equal to 查询只能在作为 AngularFireDatabase 对象的第二个参数(可选)的引用对象上调用。用法类似于Array.prototype的reduce函数。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    试试这个。

    let booksRef = this.firebase.database().ref("results/");
    booksRef.orderByChild("isbnNumber").equalTo(scannedBarCode).on("child_added", function(data) {
       console.log(data.val());
       this.bookResults = data.val();
    });
    

    我认为您已经获得了条形码值并将其保存在变量 scannerBarCode 中。

    旁注:在我看来,由于您是在 ISBN 上查询数据库,因此您应该使用它而不是 key。它会让事情变得简单。还可以尝试具有更好查询功能的新 Cloud Firestore。

    【讨论】:

    • 嗨,Samarth,感谢您回复我。我将您的建议添加到我的代码中,但不幸的是它返回了以下错误:错误:未捕获(承诺中):TypeError:无法读取未定义的属性“数据库” TypeError:无法读取未定义的属性“数据库”我不确定这是否是由于没有在构造函数中导入正确的库或做出正确的声明,或者完全不同的原因。请建议我。非常感谢。
    • 另外,建议的代码块是加在构造函数里面还是条码扫描函数里面有区别吗?在这两种情况下,我都遇到了同样的错误。
    • 提供的代码适用于 javascript 而不是 typescript
    • 感谢您的更新(是的,它是 TypeScript,抱歉我忘记提及了。这里是您可能想知道的更多信息。我正在开发 Ionic 3,并使用 Firebase 5.6.0) .我尝试运行新的更新。它崩溃并给出以下错误:错误:未捕获(承诺中):TypeError:this.database不是函数TypeError:this.database不是函数代码在github上更新以防您想查看实时版本:github.com/islamaymansais/honey_scanner/tree/master/src/pages/…请建议。非常感谢
    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 2016-05-08
    • 2023-03-23
    • 2018-03-13
    相关资源
    最近更新 更多