这是我获取数据的功能:
public void retrievedata(){
FirstRef.child(obj.getsEventID()).orderByChild("date").addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
{
if (dataSnapshot.exists())
{
DisplayMessages(dataSnapshot);
}
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
{
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private void DisplayMessages(DataSnapshot dataSnapshot) {
Iterator iterator = dataSnapshot.getChildren().iterator();
String Article = (String) ((DataSnapshot) iterator.next()).getValue();
String Key = (String) ((DataSnapshot) iterator.next()).getValue();
String Organisateur = (String) dataSnapshot.child("name").getValue().toString();
String date = (String) dataSnapshot.child("date").getValue().toString();
Date resultdate = new Date(Long.parseLong(date));
String date2 = DateFormat.format(resultdate).toString();
ListOfArticles.add(0,new ListItemTypeOne(Key, Article, Organisateur, date2));
adapter.notifyDataSetChanged();
}
假设我有10篇文章,由于以下原因它们被保存在磁盘存储器中:
FirebaseDatabase.getInstance().setPersistenceEnabled(true);
现在,当我处于离线状态时,有人又添加了2篇文章,这些文章共12篇。 如果我上线并执行“检索数据”功能,它会简单地调用内存中具有10个子代的onchildadded和从Firebase数据库中调用2个新子代吗?还是会从firebase中下载所有12个子代? >
答案 0 :(得分:0)
先前缓存的10个子级将从磁盘加载,而不会再次从服务器传输。
答案 1 :(得分:0)
当您为设备上已经存在的数据附加侦听器时,Firebase会立即使用设备上已有的数据满足侦听器。
因此Firebase客户端将立即使用我们之前持久存在的10个子节点调用您的choice = " "
while choice not 'Y' or choice not 'N' :
choice = input("Y for Yes or N for No")
。
然后它将请求发送到服务器以获取最新版本。它使用所谓的增量同步来完成此操作,这意味着它通过发送本地状态的哈希值(服务器将其与数据库中的当前状态进行比较)来实现。然后,服务器将增量发送回去,然后Firebase客户端将其用于更新其内部快照和磁盘上的状态。
如果有任何更改,则Firebase客户端会触发正确的本地事件,以允许您的应用程序更新到新状态。因此,在添加了两个子节点的情况下,它将为每个子节点调用onChildAdded
。
如果您要使用有限制的侦听器,例如说onChildAdded
,则Firebase客户端还会为不在该查询中的两个子代调用limitToLast(10)
(因为它们被推出了)由新来的孩子。)