Firebase中的DataSnapshot getValue()返回null

时间:2018-07-02 23:19:21

标签: android firebase firebase-realtime-database

主要活动的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节点的子节点。任何帮助,将不胜感激!

1 个答案:

答案 0 :(得分:0)

根据getValue()的API文档,它可以返回null:

  

此快照中包含的数据为本机类型;如果此位置没有数据,则为null。

因此,您要查询的位置没有数据。

我猜您不想在参考中对“ userid”的值进行硬编码。我敢打赌,您的意思是使用上一行的用户ID:

final String id = Profile.getCurrentProfile().getId();
my_ref = my_ref.child(id);  // id instead of "userid"