我使用firebase实时数据库。
我已经设置了:" firebaseadatabase.getInstance()。setPersistenceEnabled(true);"
很好,完美,当我离线时,所有数据都像我在线一样加载。
但是我有几个问题。
-
在我的应用程序中,我与很少的人进行了聊天小组。假设有人在一个小组中并且离线。他在聊天中写下了他想要的内容,当他将在网上上网时会发送消息。但是,当他离线时,有人将他踢出了小组。我如何告诉firebase:
if (the user still belongs to the group) { sync messages } else { don't sync messages }
我试图检查用户在离线时是否仍然属于该组,但是当它返回在线时,所有内容已经以离线模式检查了所有内容,因此数据只是在不重新计算的情况下发送。
-
让我们想象我在聊天中有50条消息。当我离线时,我会收到5条消息。当我返回在线时,它会重载55条消息还是仅仅是5个附加消息?
我只是想弄清楚我的firebase同步是否会花费我很多数据。
编辑
这是我从聊天中检索数据的方式:
public void检索(){
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 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个新闻消息,而是下载了所有消息,然后致电"老孩子"one_answers" 2个新闻孩子"。我想要的是,这2条新闻被添加到手机中的本地JSON文件中,并且每次打开保护时都不会下载所有内容。
因此,使用大约30kb的firebase数据库,即使我每天添加2kb,我每天都会下载5-10 MB ...(这是为了大学项目,所以我们现在就像2个用户)
因此,是否有解决方案(firebase只需将JSON文件更新到本地数据库中,而无需下载eveything),或者我必须自己执行我自己的SQL数据库并制作一个智能同步适配器?
?我确定Firebase必须对此做一些聪明的事情。
调用FirebaseDatabase.getInstance().setPersistenceEnabled(true)
仅确保最近收到的数据在磁盘上被缓存。它不启用数据的自动同步。
要启用节点的自动同步,您可以在引用该节点的引用时调用keepSynced(true)
。
当firebase客户端找到它已经具有用于将侦听器连接到的参考的数据时,它会散布本地数据并将结果哈希发送到服务器。然后,服务器还会寄回更新客户端版本所需的数据。这通常比完整数据集要少得多。
还在这里查看我的答案:Firebase客户如何知道要同步的数据?