Firebase:访问数据库.....但是在onDataChange方法上感到困惑

时间:2018-08-01 07:56:07

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

所以我很好奇何时会发生onDataChange方法? 当用户添加新信息或更改已经存在的数据时,它似乎已激活。

但是,我想做的是,在添加新数据之前,我想检查数据库中是否存在该项目。...如果存在相同的项目,则不会添加新数据,或者,如果没有此类项目,则应将其添加到数据库中。

所以,我的实际问题是,此过程“检查所有数据库项”是否可以在不使用onDataChange方法的情况下完成?

2 个答案:

答案 0 :(得分:0)

您基本上是为“ 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()

});

答案 1 :(得分:0)

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中已经回答了一些问题。