这个问题在这里已有答案:
我正在尝试使用firebase进行搜索查询,它的效果非常好。
Query searchQuery = usersRef.orderByChild(child).startAt(text).endAt(text + "\uf8ff").limitToFirst(limit);
searchQuery.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//search result logic
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
我已经启用了离线功能,因为需要它们在我的应用程序中,这是我的问题:这个ValueEventListener一直在监听本地存储的数据,而我需要保持它始终更新...这是一个搜索查询。
我不认为keepSynced(true)应用于用户参考将是一个好主意,因为这个引用是巨大的,这将导致大量的互联网和内存浪费。
我在网上红了,使用addValueEventListener而不是addListenerForSingleValueEvent查询将始终从服务器接收更新的答案,而不查看本地存储的数据。这可能是解决我的问题的一种方法,但我需要监听数据ONCE,这将继续监听数据,所以如果我决定使用它,我应该停止这个监听器吗?
请帮助我一些想法,抱歉我的学术英语。
如果您启用了离线功能,则意味着即使它暂时失去网络连接,您也可以使用自己的应用。所以只要你是ValueEventListener
,offline
就会继续收听本地存储的数据。如果您想要更新结果,那么您需要上线。
如果您只想听一次数据,那么您需要使用:addListenerForSingleValueEvent()。如果你想使用addValueEventListener
,请不要忘记根据活动的生命周期删除监听器,因为我已经回答了here。
那么你可以保持对你的事件监听器的引用,并在你不需要时从引用中删除它。
myEventListener = ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//happy place
}
@Override
public void onCancelled(DatabaseError databaseError) {
//error
}
});
别的地方:
ref.removeEventListener(myEventListener);