我使用Firebase实时数据库。
我已设置:“ FirebaseDatabase.getInstance()。setPersistenceEnabled(true);”
太好了,当我离线时,所有数据都会像我在线时一样被加载。
但是我有几个问题。
在我的应用中,我与几个人聊天。 假设某人在一个小组中并且处于离线状态。他在聊天中写下了自己想要的内容,并且当他在线时会发送消息。 但是,当他离线时,会有人将他踢出队伍。我该如何告诉firebase:
if (the user still belongs to the group)
{
sync messages
}
else
{
don't sync messages
}
我试图检查用户在脱机时是否仍属于该组,但是当它重新联机时,所有内容都已在脱机模式下进行了检查,因此数据发送时无需再次确认。
假设我的聊天中有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必须对此做一些聪明的事情。
答案 0 :(得分:0)
调用FirebaseDatabase.getInstance().setPersistenceEnabled(true)
仅确保将最近接收到的数据缓存在磁盘上。它不会启用数据的自动同步。
要启用节点的自动同步,可以在对该节点的引用上调用keepSynced(true)
。
当Firebase客户端发现它已经具有用于将侦听器连接到的引用的数据时,它将对本地数据进行哈希处理,然后将生成的哈希发送到服务器。然后,服务器发回更新客户端的数据版本所需的数据。通常,此数据要比完整数据集少很多。
也请在这里查看我的答案:How does firebase client know what data to sync?