当前位置: 首页 > 知识库问答 >
问题:

Firebase脱机同步=>我可以使用条件同步吗?Android系统

董同
2023-03-14

我用的是firebase实时数据库

我已经设置了:“FireBaseDatabase.GetInstance().SetPersistenceEnabled(true);”

>

  • 在我的app里,我有很少人的聊天群。让我们假设某人在一个组中,并且处于离线状态。他在聊天中写出他想要的内容,当他转到网上时,这些信息就会被发送出去。但是,就在他下线的时候,有人把他踢出了群。如何告诉firebase:

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

    当他离线时,我试着检查用户是否仍然属于这个组,但是当它回到线上时,所有的东西都已经在离线模式下检查过了,所以数据只是发送而不计后果。

    让我们想象一下我的聊天中有50条消息。当我离线的时候,我收到5条消息。当我重新上网时,它会重新下载55条消息还是只下载5条附加消息?

    编辑

    下面是我从聊天中检索数据的方法:

    public void 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
    
        }
    });
    
        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条新消息:它不是调用onChildAdded获取2条新闻消息,而是下载所有消息,然后调用onChildAdded获取旧的子消息和2条新闻子消息。我想要的是,这2条新闻消息被添加到我手机中的本地json文件中,而每一条消息都不是每次我打开保存时下载的。

    我确信firebase一定为此做了些聪明的事情。

  • 共有1个答案

    郎吉星
    2023-03-14

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

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

    当Firebase客户机发现它已经有了要连接侦听器的引用的数据时,它会对本地数据进行散列,并将得到的散列发送到服务器。服务器然后发回更新客户端数据版本所需的数据。这通常比完整数据集的数据要少得多。

    这里还可以看到我的答案:firebase客户端如何知道要同步哪些数据?

     类似资料:
    • 问题内容: java.util.concurrent.atomic软件包的javadoc表示以下内容: 一个小的类工具包,支持对单个变量进行无锁线程安全编程。 但是我没有在任何AtomicInteger或AtomicBoolean类中看到任何线程安全的(同步或锁定)代码。 因此,这2个是否相同: 1。 2。 更新 :感谢您的回答。使用AtomicInteger时需要挥发吗? 问题答案: 它们将提供

    • Hi必须使用firestore在离线在线synario聊天应用程序。例如,有时用户向其他用户发送消息,但没有internet连接。但当用户打开internet连接时,消息应立即同步到数据基础上。它在firebase中工作,但不知道它在FireStore中是如何工作的。

    • 问题内容: 想象我在一个已经有后台线程的服务中。我可以在同一线程中使用Volley发出请求,以便回调同步发生吗? 这样做有两个原因:-首先,我不需要另一个线程,创建它会很浪费。-其次,如果我处于ServiceIntent中,则线程的执行将在回调之前完成,因此,我不会收到Volley的响应。我知道我可以创建自己的Service,该Service具有可以控制的Runloop线程,但是最好在volley

    • 我正在开发一个项目,需要远程删除帐户和同步,如Facebook,Twitter,Dropbox等...这是否可以通过编程来实现?需要你们的意见... 多谢了。

    • 是否可以调用一个异步方法,以便它从一个同步的方法异步运行?我不关心它挂起同步调用程序直到它返回,而是希望该方法被异步调用。

    • 我正在尝试做一个应用程序,与音频文件工作。我必须在应用程序的一部分中导入和合并来自Firebase的音频文件。 下面是来自合并操作的代码块; 问题是下载firebase文件的代码继续工作。正如您所看到的,我试图用无限循环来修复这一点,但Firebase在没有正确加载时创建文件,因此解决方案没有成功。 我试图编写为加入onSuccess事件而创建的数组,但在这种情况下,我将无法完全准备好要使用的数组