Firebase离线同步=>我可以使用条件进行同步吗?安卓

时间:2019-03-11 12:42:33

标签: android firebase firebase-realtime-database

我使用Firebase实时数据库。

我已设置:“ FirebaseDatabase.getInstance()。setPersistenceEnabled(true);”

太好了,当我离线时,所有数据都会像我在线时一样被加载。

但是我有几个问题。

  1. 在我的应用中,我与几个人聊天。 假设某人在一个小组中并且处于离线状态。他在聊天中写下了自己想要的内容,并且当他在线时会发送消息。 但是,当他离线时,会有人将他踢出队伍。我该如何告诉firebase:

    if (the user still belongs to the group)
    {
        sync messages
    }
    else
    {
        don't sync messages
    }
    

    我试图检查用户在脱机时是否仍属于该组,但是当它重新联机时,所有内容都已在脱机模式下进行了检查,因此数据发送时无需再次确认。

  2. 假设我的聊天中有50条消息。离线时,我会收到5条消息。当我重新上网时,它会重新下载55条消息还是仅重新下载5条Extras消息?

我只是想弄清楚firebase同步是否会消耗大量数据。

编辑

这是我从聊天中检索数据的方式:

公共无效retrievedata(){

UserMessageRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) /**** HERE IS THE PROBLEM***/
    {

        if (dataSnapshot.exists()) {
            DisplayMessages(dataSnapshot);
        }

    }

    @Override
    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
      //Nothings
    }

    @Override
    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
      //Nothings

    }

    @Override
    public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {              //Nothings


    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
      //Nothings

    }
});

} //检索消息的功能

private void DisplayMessages(DataSnapshot dataSnapshot){迭代器iterator = dataSnapshot.getChildren()。iterator();

    String chatImage = (String) ((DataSnapshot) iterator.next()).getValue();
    String chatMessage = (String) ((DataSnapshot) iterator.next()).getValue();
    String nID = (String) ((DataSnapshot) iterator.next()).getValue();
    String chatTime = (String) ((DataSnapshot) iterator.next()).getValue().toString();



    ListOfChats.add(new ChatClass(nID, chatMessage, chatTime, chatImage));



    adapter.notifyDataSetChanged();

} 现在是问题所在。

如果我离线并且聊天,那么消息只是从磁盘中检索出来的,就可以了。

但是,如果我上线并收到2条新消息:它会下载所有消息,而不是为2条新闻消息调用onChildAdded,然后与旧的孩子和2条新闻孩子一起调用onChildAdded。我想要的是将这2条新闻消息添加到手机中的本地json文件中,并且每次打开保护区时都不会下载任何内容。

因此,使用一个大约30KB的Firebase数据库,即使我每天添加2KB,我每天也有5-10 MB的下载...(这是针对大学项目的,因此我们现在好像有2个用户)

那么有解决方案吗(firebase只需将json文件更新到本地数据库中而不下载任何内容),还是我必须做自己的SQL数据库并制作一个智能同步适配器?

我确信firebase必须对此做一些聪明的事情。

1 个答案:

答案 0 :(得分:0)

调用FirebaseDatabase.getInstance().setPersistenceEnabled(true)仅确保将最近接收到的数据缓存在磁盘上。它不会启用数据的自动同步。

要启用节点的自动同步,可以在对该节点的引用上调用keepSynced(true)

当Firebase客户端发现它已经具有用于将侦听器连接到的引用的数据时,它将对本地数据进行哈希处理,然后将生成的哈希发送到服务器。然后,服务器发回更新客户端的数据版本所需的数据。通常,此数据要比完整数据集少很多。

也请在这里查看我的答案:How does firebase client know what data to sync?