我尝试使用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一直在监听本地存储的数据,而我需要保持它始终更新...它是一个搜索查询。< / p>
我不认为将keepSynced(true)应用于用户引用会是一个好主意,因为这个引用很大,这将导致大量的互联网和内存浪费。
我在网上发现红色使用addValueEventListener而不是addListenerForSingleValueEvent查询将始终从服务器接收更新的答案,而不会查看本地存储的数据。 这可能是解决我的问题的一种方法,但我需要监听数据ONCE,这将继续监听数据,所以如果我决定使用它,我应该停止这个监听器吗?
请帮助我一些想法并抱歉我的学术英语。
答案 0 :(得分:1)
您可以保留对事件监听器的引用,并在不需要时将其从引用中删除。
myEventListener = ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//happy place
}
@Override
public void onCancelled(DatabaseError databaseError) {
//error
}
});
其他地方:
ref.removeEventListener(myEventListener);
答案 1 :(得分:1)
如果您启用了离线功能,则表示即使暂时失去网络连接,您也可以使用自己的应用。因此ValueEventListener
只要您offline
,就会继续监听本地存储的数据。如果您希望更新结果,则需要上线。
如果您只想听一次数据,则需要使用:addListenerForSingleValueEvent()。如果您想使用addValueEventListener
,请不要忘记根据活动的生命周期删除听众,因为我已经回答 here 。