Firebase 实时数据库在第二次返回快照时返回错误的值



我正在从数据库中读取用户配置文件,但是第一次读取时,它返回正确的值(用户对象的完整属性(,但第二次触发时,它只返回1个属性(其他属性为null(。 这是我的代码

if (mProfileValueEvent != null) mProfileRef.removeEventListener(mProfileValueEvent);
mProfileValueEvent = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (getFirebaseUser() != null) {
if (dataSnapshot.exists()){
final User user = dataSnapshot.getValue(User.class);
Log.d("RRRRRRRR1",dataSnapshot+"");
if (user != null) {
Log.d("RRRRRRRR2",user.getName()+"");
tv_name.setText(user.getName());
tv_email.setText(user.getEmail());
tv_status.setText(user.getStatus());
setAvatarToView(user.getThumbAvatarUrl(), user.getName(), civ_avatar);
setMyGlobalProfile(user);
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
mProfileRef.addValueEventListener(mProfileValueEvent);

这是日志猫:

/RRRRRRRR1: DataSnapshot { key = kk44p2XW97OIxAudLwekOZwZM7B2, value = {password=12345678, status="pla pla", verified=true, userId=kk44p2XW97OIxAudLwekOZwZM7B2, dateofbirth=18/08/2003, lastSeen=1575100843974, email="email@gmail.com", name=Mẫn Mẫn, gender=Nữ, joinedDate=18/08/2019} }
/RRRRRRRR2: Mẫn Mẫn
/RRRRRRRR1: DataSnapshot { key = kk44p2XW97OIxAudLwekOZwZM7B2, value = {lastSeen=-1} }
2019-11-30 15:05:22.377 24224-24224/com.example.tranquoctrungcntt.uchat D/RRRRRRRR2: null 

库的版本

implementation 'com.google.firebase:firebase-database:19.2.0'

这是我用来读取用户配置文件的完整代码

检查连接以了解在线或离线用户

mDatabaseConnectionValueEvent = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
boolean isConnected = dataSnapshot.getValue(Boolean.class);
if (isConnected) {
final DatabaseReference ACTIVE_REF = 
ROOT_REF.child(CHILD_USERS).child(getMyUID());
Map<String, Object> mapOnline = new HashMap<>();
mapOnline.put(kLastSeen, -1);
ACTIVE_REF.updateChildren(mapOnline);
} else {
final DatabaseReference ACTIVE_REF = 
ROOT_REF.child(CHILD_USERS).child(getMyUID());
Map<String, Object> mapOffline = new HashMap<>();
mapOffline.put(kLastSeen, getCurrentTimeInMilies());
ACTIVE_REF.updateChildren(mapOffline);
}
updateDatabaseConnectionStatus(isConnected);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
CONNECT_REF.addValueEventListener(mDatabaseConnectionValueEvent);

*然后,我像这样阅读用户资料:*


mProfileValueEvent = new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (getFirebaseUser() != null) {
final User user = dataSnapshot.getValue(User.class);
//should set up UI, but the snapshot contains only one key 
// "lastSeen"

}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
mProfileRef.addValueEventListener(mProfileValueEvent);

注意:此问题仅在应用程序首次启动时发生。首次启动后,它工作正常(返回足够的数据,我认为是因为数据被缓存了(

Firebase 客户端始终会在某个位置触发数据的完整快照。因此,如果您获得此输出:

DataSnapshot { key = kk44p2XW97OIxAudLwekOZwZM7B2, value = {lastSeen=-1} }

有一些代码只用一个lastSeen值写入kk44p2XW97OIxAudLwekOZwZM7B2。您可能需要检查代码中是否调用setValue(),因为这可以解释为什么kk44p2XW97OIxAudLwekOZwZM7B2下的先前数据在第二个快照中消失了。

最新更新