所以我很好奇何时会发生onDataChange方法? 当用户添加新信息或更改已经存在的数据时,它似乎已激活。
但是,我想做的是,在添加新数据之前,我想检查数据库中是否存在该项目。...如果存在相同的项目,则不会添加新数据,或者,如果没有此类项目,则应将其添加到数据库中。
所以,我的实际问题是,此过程“检查所有数据库项”是否可以在不使用onDataChange方法的情况下完成?
答案 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中已经回答了一些问题。