【问题标题】:Firebase setPersistenceEnabled(true) what about the downloaded dataFirebase setPersistenceEnabled(true) 下载的数据怎么样
【发布时间】:2019-08-08 03:20:54
【问题描述】:

这是我获取数据的函数:

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 篇。 如果我上网,并执行“检索数据”功能,它会简单地调用 onchildadd 与内存中的 10 个孩子和来自 firebase 数据库的 2 个新孩子,还是会从 firebase 下载所有 12 个孩子?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    当您为设备上已存在的数据附加监听器时,Firebase 会立即使用设备上的数据满足监听器的要求。

    因此,Firebase 客户端将立即调用您的 onChildAdded,并使用我们之前保留的 10 个子节点。

    然后它向服务器发送请求以获取最新版本。它通过所谓的 delta-sync 执行此操作,这意味着它通过发送本地状态的哈希值,服务器将其与数据库中的当前状态进行比较。然后服务器将增量发回,Firebase 客户端随后使用它来更新其内部快照和磁盘上的状态。

    如果有任何更改,Firebase 客户端会触发正确的本地事件,以允许您的应用更新到新状态。因此,在添加了两个子节点的情况下,它将为每个子节点调用onChildAdded

    如果您要使用具有限制的侦听器,例如 limitToLast(10),那么 Firebase 客户端还将为不再在该查询中的两个子代调用 onChildRemoved(因为它们被新的子代推出)。

    【讨论】:

    • 好的,我明白了,但是我已经用你的例子“limitToLast(10)”进行了测试结果:- 1)如果我有 10 篇文章并添加 2 篇文章,我的列表中有 12 篇文章。好的正常,因为我没有放置方法 OnChildDeleted -2​​)如果我退出活动并重新加载它,它将仅加载 10first 文章--->现在这是我想知道的关于 2)案例的事情: => 必须更新数据以“推动”两个孩子,并且不能成为我的功能,因为我没有放置任何 onChilddeleted 方法。是不是只下载了 2news 文章,而我的应用自动推送其他文章?
    • 1) 那是因为你忽略了onChildRemoved。 2) 正如我所描述的,Firebase 客户端更新其数据的内部副本。因此,如果您附加一个新的侦听器,它将获得最新的快照。
    • 好的,谢谢先生。但是您说它首先从磁盘内存中加载文件,然后才检查是否有任何升级并触发功能(在这种情况下添加了子项)。那么你能告诉我为什么如果我不放 limitTofirst() (我展示的原始功能)并且如果我删除 5 个项目而没有 onchildremoved 方法 () 他们仍然会从我的列表中删除?他们不应该,因为它首先从磁盘加载数据,然后才更新
    • 如果它仍然与已从服务器中删除的子节点一起触发,则这些子节点必须来自本地缓存。如果这些已删除的子节点没有触发,则它们必须已从本地缓存中删除。
    【解决方案2】:

    之前缓存的 10 个子节点将从磁盘加载,不再从服务器传输。

    【讨论】:

    猜你喜欢
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2016-10-26
    • 2011-10-26
    • 2016-09-23
    • 2019-07-27
    相关资源
    最近更新 更多