主要活动的onCreate()方法中的例程之一是与Firebase数据库进行通信以执行以下三项操作之一: 1)如果用户是回头用户,请在本地使用SharedPreferences存储的Firebase上更新其所有首选项。 2)如果用户是新用户,并且云上没有存储任何数据(他们从未下载过该应用程序),则不执行任何操作。 3)如果用户是新用户,但首选项存储在其唯一的Facebook个人资料ID下,请下载其首选项并将其应用于SharedPreferences实例。
我必须对DataSnapshot的工作方式缺少一些关键的,可能是基本的见解,因为我无法使以下代码正常工作:
private void initializeFirebase(){
my_db = FirebaseDatabase.getInstance();
DatabaseReference my_ref = my_db.getReference();
Map<String, ?> values = sharedPreferences.getAll();
if (values.isEmpty()){
final String id = Profile.getCurrentProfile().getId();
my_ref = my_ref.child("userid");
my_ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.getKey().equals(id)){
data = (Map<String, Object>)dataSnapshot.getValue();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
else {
for (Map.Entry<String, ?> entry : values.entrySet()) {
my_ref.child("userid").child(Profile.getCurrentProfile().
getId()).child(entry.getKey()).setValue(entry);
}
}
}
data是一个全局Map变量,在执行getValue()之后始终为null。
我的JSON树的组织方式为:根->用户->用户ID->每个首选项都作为用户ID节点的子节点。任何帮助,将不胜感激!
答案 0 :(得分:0)
根据getValue()的API文档,它可以返回null:
此快照中包含的数据为本机类型;如果此位置没有数据,则为null。
因此,您要查询的位置没有数据。
我猜您不想在参考中对“ userid”的值进行硬编码。我敢打赌,您的意思是使用上一行的用户ID:
final String id = Profile.getCurrentProfile().getId();
my_ref = my_ref.child(id); // id instead of "userid"