来自Firebase API:
已添加儿童:此活动将针对每个初始儿童触发一次 在这个位置,它会在每次新的时候再次触发 孩子被添加。
一些代码:
listRef.on('child_added', function(childSnapshot, prevChildName) {
// do something with the child
});
但是,由于该位置的每个孩子都会调用该函数,有没有办法只获取实际添加的孩子?
答案 0 :(得分:37)
要跟踪自某个检查点以来添加的内容而不提取以前的记录,您可以使用endAt()
和limit()
来获取最后一条记录:
// retrieve the last record from `ref`
ref.endAt().limitToLast(1).on('child_added', function(snapshot) {
// all records after the last continue to invoke this function
console.log(snapshot.name(), snapshot.val());
});
答案 1 :(得分:36)
limit()
方法。 limitToLast()
和limitToFirst()
方法取代了它。
// retrieve the last record from `ref`
ref.limitToLast(1).on('child_added', function(snapshot) {
// all records after the last continue to invoke this function
console.log(snapshot.name(), snapshot.val());
// get the last inserted key
console.log(snapshot.key());
});
答案 2 :(得分:3)
我尝试了其他答案,但至少为最后一个孩子调用了一次。如果您的数据中有时间密钥,则可以这样做。
MyConnection = New System.Data.OleDb.OleDbConnection(String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & indlg.FileName & ";Extended Properties=Excel 8.0"))
答案 3 :(得分:2)
由于在没有数据的情况下调用ref.push()
方法会根据时间生成路径键,这就是我所做的:
// Get your base reference
const messagesRef = firebase.database().ref().child("messages");
// Get a firebase generated key, based on current time
const startKey = messagesRef.push().key;
// 'startAt' this key, equivalent to 'start from the present second'
messagesRef.orderByKey().startAt(startKey)
.on("child_added",
(snapshot)=>{ /*Do something with future children*/}
);
请注意,实际上没有任何内容写入ref.push()
返回的引用(或“键”),因此无需捕获空数据。
答案 4 :(得分:1)
Swift3解决方案:
您可以通过以下代码检索以前的数据:
queryRef?.observeSingleEvent(of: .value, with: { (snapshot) in
//Your code
})
然后通过以下代码观察新数据。
queryRef?.queryLimited(toLast: 1).observe(.childAdded, with: { (snapshot) in
//Your Code
})
答案 5 :(得分:0)
由于.limitToLast()
方法仍然调用列表中的最后一项,即使它不是新项,我们也可以按以下方式解决它:
想法是:
创建一个列表,保留您的Firebase物品;每当调用onChildAdded(...)
方法时,检查传入的数据快照是否在您的列表中;如果没有,那就是新数据
要实现这一目标,您必须满足以下条件:
每个项目都有唯一的值。 (这可以通过使用.push()
方法生成的密钥将项目添加到Firebase中来实现。
重写模型类的.equals()
方法,以便基于此唯一值完成比较。
代码段
注意:我将选择的项目列表放在模型类中。
模型类
public class MyModel {
private String id; // unique ID from model to another
public static List<MyModel> sItems; // my tracked items
// reset of fields ...
public MyModel() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public boolean equals(@Nullable Object o) {
// If the object is compared with itself then return true
if (o == this) {
return true;
}
// Check if o is an instance of MyModel or not
if (!(o instanceof MyModel)) {
return false;
}
// typecast o to MyModel so that we can compare data members
MyModel model = (MyModel) o;
// Compare data based on the unique id
return (model.id).equals(id);
}
}
Firebase监听器
private ChildEventListener mChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
Log.d(TAG, "ChildEventListener: onChildAdded()");
MyModel deal = dataSnapshot.getValue(MyModel.class);
if (!MyModel.sItems.contains(model)) {
// Here you'll receive only the new added values
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
Log.d(TAG, "ChildEventListener: onChildChanged()");
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
Log.d(TAG, "ChildEventListener: onChildRemoved()");
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
Log.d(TAG, "ChildEventListener: onChildMoved()");
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, "ChildEventListener: onCancelled()");
}
};
然后限制到最后
databaseReference.limitToLast(1).addChildEventListener(mChildEventListener);