一般来说,我是android和java的新手。
我正在尝试创建一个Android应用程序,其中将对象存储在Firebase实时数据库中。根据需要,我使用addListnerForSingleValueEvent从数据库中获取对象。
mDatabase.child(itemType).child(id).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
T entity = dataSnapshot.getValue(typeParameterClass);
callback.onSuccess(entity);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
callback.onFailure();
}
});
这里的回调是我自己的回调类的对象。
我试图了解如何始终保持实体更新。
有没有一种方法可以保留对我创建的实体对象的引用,并在使用addValueEventListner在数据库中更新对象时对其进行更新,以使其在整个应用程序中得到反映?我了解在回收者视图中,数据会自动更新。我的问题不是针对回收者视图的情况。
如果有这种方法,那么我将如何处理不同的代码段为同一数据库对象创建不同的客户端对象的情况?有没有一种方法可以在客户端中为每个数据库对象强制实施单个对象?
我希望我的问题不模糊。
编辑1:
基于注释,添加了简约的数据库结构。还有更多类似“消息”的结构很复杂(包含列表等)。
编辑2:
我知道addValueEventListner将为数据库中的每个更新触发onDataChange方法。我的问题是如何使本地对象保持最新状态,以及如何为客户端中的每个数据库对象强制执行单个本地对象。请阅读原始问题以获取更多详细信息。
答案 0 :(得分:0)
使用
addValueEventListener
代替
addListenerForSingleValueEvent
示例:
// My top posts by number of stars
mDatabase.child(itemType).child(id).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
// TODO: handle the post
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Getting Post failed, log a message
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
// ...
}
});