总的来说,我对 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();
}
});
这里的callback是我自己的回调类的一个对象。
我试图了解如何始终保持实体更新。
有没有一种方法可以保留对我创建的实体对象的引用,并在使用 addValueEventListner 在数据库中更新对象时更新它,以便它反射(reflect)在整个应用程序中?据我所知,在回收站 View 中数据会自动更新。我的问题不是针对回收者 View 的情况。
如果有这样的方法,那么我该如何处理不同的代码为同一个数据库对象创建不同的客户端对象的情况?有没有办法在客户端中强制每个数据库对象使用单个对象?
我希望我的问题不是含糊不清。
编辑1:
基于Comment,添加简约的数据库结构。还有更多像“消息”这样复杂的结构(包含列表等)。
编辑2:
据我了解,addValueEventListner 将为数据库中的每次更新触发 onDataChange 方法。我的问题是如何使本地对象保持最新以及如何为客户端中的每个数据库对象强制执行单个本地对象。请阅读原始问题以了解更多详细信息。
最佳答案
使用
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());
// ...
}
});
关于java - 如何使用 firebase 数据库更新本地对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55841707/