【问题标题】:Firebase: Access to database.....but confused at onDataChange methodFirebase:访问数据库.....但对 onDataChange 方法感到困惑
【发布时间】:2019-01-08 17:18:57
【问题描述】:

所以我很好奇 onDataChange 方法什么时候出现? 当用户添加新信息或更改已存在的数据时,它似乎被激活。

但是,我想做的是,在添加新数据之前,我想检查该项目是否存在于数据库中....如果有相同的项目,则不会添加新数据,或者如果没有这样的项目,那么它应该被添加到数据库中。

所以,我的实际问题是,这个“检查所有数据库项目”的过程,可以不使用 onDataChange 方法来完成吗?

【问题讨论】:

  • 您能否重新构建您的问题并添加一些具有数据库结构的示例代码以使其更清晰?

标签: database firebase android-studio firebase-realtime-database


【解决方案1】:

您基本上设置了对“onDataChange”的订阅,因此它实际上正在监视 firebase 的变化。

但为了检查,您可以阅读结果或一次性查询您的数据所在的确切路径。

记录所有内容然后在不需要时删除数据也可能是更好的选择。

import { AngularFirestore } from 'angularfire2/firestore';
import { AngularFireDatabase, AngularFireList } from 'angularfire2/database';
import { map } from 'rxjs/operators';
import { Observable, Subscription } from 'rxjs';

import firebase as firebase from 'firebase/app';

private mysubscription: Subscription;

public this.items:any = [];

constructor(
  public _DB: AngularFireDatabase
) {

  try {

//subscription using AngulaFire
this.mysubscription = this._DB.list("myFireBaseDataPath").snapshotChanges().pipe(map(actions => {
    return actions.map(action => ({ key: action.key, val: action.payload.val() }));
  }))
  .subscribe(items => {

    this.items = [];
    this.items = items.map(item => item);

    console.log("db results",this.items);

    var icount=0;

    for (let i in this.items) {

     console.log("key",this.items[i].key);
     console.log("val",this.items[i].val); 
     console.log("----------------------------------);

     //checking if something exists
     if (this.items[i].key == 'SomeNodePath') {
       var log = this.items[i].val;
     }

    }


  } catch (e) {
    console.error(e);
  }


  });


}

ngOnDestroy() {
  this.mysubscription.unsubscribe();
}

//或者我们可以只使用 firebase 模块进行一次性查询

try {


return firebase.database().ref("myFireBaseDataPath").once('value').then(function(snapshot) { return snapshot.val(); })
    .then(res => {

      for (let myNode in res) {


        console.log(res[myNode]);
        console.warn(res[myNode].myChildPath);
        console.log("----------------------------------);

      }

    })
    .catch(error => console.log(error));


} catch (e) {
  console.error(e);
}

//不过最好先记录所有数据,然后在不需要时firebase.database().ref(/logs").remove();整个日志

var desc ="abc";

let newPostKey = firebase.database().ref("/logs").push();

newPostKey.set({

  'info': desc,
  'datetime': new Date().toISOString()

});

【讨论】:

  • 这个问题有一个Android标签
【解决方案2】:

onDataChange方法什么时候出现?

onDataChange 方法在它附加到的数据库引用中的每次更改都会被调用。每次访问它所附加的数据库引用时也会调用它。 例如,

    final FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference ref = database.getReference("some/database/refrence");

    ref.addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
      // This method will be fired for any change in the 
         database.getReference("some/database/refrence") part of the database.
      // It will also be fired anytime you request for data in the 
         database.getReference("some/database/refrence") part of the database
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {
        System.out.println("The read failed: " + databaseError.getCode());
      // This method will be fired anytime you request for data in the 
         database.getReference("some/database/refrence") part of the database
         and an error occurred
      }
    });

在添加新数据之前,我想检查该项目是否存在于数据库中......如果有相同的项目,则不会添加新数据,或者如果没有这样的项目,那么它应该被添加到数据库中。

这可以通过对从数据库查询中检索到的快照调用exists() 方法来完成。 检查这个 stackoverflow 问题Checking if a particular value exists in the firebase database 以获得答案

那么,我的实际问题是,这个“检查所有数据库项”的过程,是否可以不使用 onDataChange 方法来完成?

没有。 onDataChange 方法是用于从数据库中检索数据的回调。即使您在查询中使用equalTo() 方法,您仍然必须使用onDataChange 方法。

我不是 Firebaser 专家。这里有在 Firebase 工作的人。他们可以为您提供更多信息

PS:请在提问前先对您的问题进行研究。文档和 stackoverflow 中已经回答了一些问题。

【讨论】:

  • 谢谢!!!下次我会在 Stackoveflow 中仔细检查我的问题,然后再问!!!祝你有美好的一天
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 2017-03-20
  • 2013-07-19
  • 1970-01-01
  • 2013-05-09
相关资源
最近更新 更多