【发布时间】:2018-06-20 12:56:35
【问题描述】:
我目前正在从 Firebase 获取单个 dataSnapshot,如下所示:
public Task<DataSnapshot> getLatestMessage(@NonNull String roomId) {
final TaskCompletionSource<DataSnapshot> source = new TaskCompletionSource<>();
DatabaseReference dbRef = mDatabase.getReference(NODE_MESSAGES).child(roomId);
dbRef.keepSynced(true);
ValueEventListener listener = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
source.setResult(dataSnapshot);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
source.setException(databaseError.toException());
}
};
Query query = dbRef.orderByKey().limitToLast(1);
query.addListenerForSingleValueEvent(listener);
return source.getTask();
}
请注意,我已经在 dbRef 对象上调用了 keepSynced()。
这是示例数据结构:
/root
/messages
/$roomId
/$messageId
/content
/timestamp
/etc...
我能够按预期获取最新的单个快照数据,但我想知道,如果我将 keepSynced() 调用移动到 Query 对象而不是 DatabaseReference 中会有什么不同吗?即
// dbRef.keepSynced(true); >> REMOVE THIS <<
ValueEventListener listener = new ValueEventListener() {...};
Query query = dbRef.orderByKey().limitToLast(1);
query.keepSynced(true); // >> ADD THIS <<
query.addListenerForSingleValueEvent(listener);
目前,我们目前在 Firebase 上的平均负载(每天)为 50%,并且随着用户的稳定流入,我想知道它是否可以以某种方式改善应用中的任何内容,尤其是负载方面。我什至尝试过像这样愚蠢的事情:
dbRef.keepSynced(true);
ValueEventListener listener = new ValueEventListener() {...};
Query query = dbRef.orderByKey().limitToLast(1);
query.addListenerForSingleValueEvent(listener);
dbRef.keepSynced(false);
-- 在开始时启用keepSynced() 以确保引用指向最新版本,然后在查询并添加侦听器后禁用它。不幸的是,这并不像保持启用状态那样提供新数据。
我已经通过了Optimization DB Performance documentation 并相信我根据需要遵循了建议的做法。
【问题讨论】:
标签: android firebase firebase-realtime-database