【发布时间】:2019-01-10 18:28:47
【问题描述】:
在我的 Firebase 数据库中,有一些值存储在推送键下,我试图通过它们的键检索这些值,从 其中的最后 10 个开始。 问题是它不是从最后 10 位的键开始而是从特定键开始。 那个键是这段代码第一次初始化的那个,它应该是最后 10 个中的第一个。但是添加了新数据,并且即使在重新安装、重新启动应用程序之后,它也会忽略它。 如果我将数字更改为其他数字,那么它可以正常工作,直到我将新消息添加到数据库。然后同样的事情发生在那个号码上。
注意:已经传递给conversationRef的ConversationPushID(string)是正确的,数据结构是正确的,只是为了安心分享而已,我检查了。
查询代码:
final DatabaseReference conversationsRef = firebaseInstance.rootRef
.child(mContext.getString(R.string.dbname_conversations))
.child(ConversationPushID);
Query getLastMessagesQuery = conversationsRef.orderByKey().limitToLast(10);
getLastMessagesQuery.addListenerForSingleValueEvent(new ValueEventListener()
{
@Override
public void onDataChange(@NonNull DataSnapshot snap)
{
for (DataSnapshot dataSnapshot : snap.getChildren())
{
Message message = dataSnapshot.getValue(Message.class);
String messageKey = dataSnapshot.getKey();
messageList.add(message);
}
getLastMessageFromListener = false;
setListenerForLastMessage();
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
}
});
附加信息(在此之后分配了另一个查询,写以防万一有连接。因为这个错误在全部
private void setListenerForLastMessage()
{
final DatabaseReference conversationsRef = firebaseInstance.rootRef
.child(mContext.getString(R.string.dbname_conversations))
.child(ConversationPushID);
getLastMessageQuery = conversationsRef.orderByKey().limitToLast(1);
lastMessageListener = new ChildEventListener()
{
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
{
Message message = dataSnapshot.getValue(Message.class);
if (getLastMessageFromListener)
{
messageList.add(message);
}
getLastMessageFromListener = true;
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
{
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot)
{
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
{
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError)
{
}
};
getLastMessageQuery.addChildEventListener(lastMessageListener);
}
【问题讨论】:
-
如果您的
conversationsRef没有任何问题,那么这很难说,实际上出了什么问题。 -
@PradyumanDixit 它是在函数本地范围内的 Query 之前声明的。我在问题中添加了更多细节,也许它会有所帮助。
-
我不认为另一个查询会干扰它,除非它们同时触发,这不应该发生。
-
@Shehroz 我知道,但这不是它的目的。我在启动应用程序时再次调用它,因此添加后数据已经存在。
标签: android firebase firebase-realtime-database