Firebase setPersistenceEnabled(true)下载的数据如何

时间:2019-03-17 17:20:24

标签: android firebase firebase-realtime-database

这是我获取数据的功能:

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个子代? >

2 个答案:

答案 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)(因为它们被推出了)由新来的孩子。)