Android:为什么Firebase数据库中的值未正确存储?

时间:2018-08-30 09:09:22

标签: android firebase firebase-realtime-database

我用于存储Firebase数据库中uid子级值的代码如下:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                String data = (String) parent.getItemAtPosition(position);
                usersdRef.orderByChild("username").equalTo(parent.toString()).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        for(DataSnapshot data: dataSnapshot.getChildren()){
                           String dataUID = data.child("uid").getValue(String.class);
                            toUid = dataUID;
                        }
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {

                    }
                });

                Intent intent = new Intent(Main2Activity.this, Main5Activity.class);
                intent.putExtra("valueName", data);
                intent.putExtra("valueUID",toUid);
                startActivity(intent);

            }
        });

但是当我尝试在不同的活动中使用该值时,该值将作为null传递。我获取并使用该值作为:

Bundle bundle = getIntent().getExtras();
        assert bundle != null;
        final String hName = bundle.getString("valueName");
        final String td = bundle.getString("valueUID");

hName存储得很好,但是td作为null传递。

firebase数据库如下所示:

firebase database

2 个答案:

答案 0 :(得分:1)

这是因为您试图在实际回调之外访问变量toUid的值。回调意味着异步,这意味着您不能只在定义后的下一行访问它的结果。您的代码还可以,但是作为一个主意,请在回调方法内而不是在回调本身下访问此变量

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        String data = (String) parent.getItemAtPosition(position);
        usersdRef.orderByChild("username").equalTo(parent.toString()).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for(DataSnapshot data: dataSnapshot.getChildren()){
                   String dataUID = data.child("uid").getValue(String.class);
                   toUid = dataUID;

                   Intent intent = new Intent(Main2Activity.this, Main5Activity.class);
                   intent.putExtra("valueName", data);
                   intent.putExtra("valueUID",toUid);
                   startActivity(intent);
            }
        }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }
});

答案 1 :(得分:0)

要解决此问题,请使用以下代码:

lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

        String data = (String) parent.getItemAtPosition(position);

        String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        DatabaseReference uidRef = rootRef.child("users").child(uid);
        ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String dataUID = dataSnapshot.child("uid").getValue(String.class);
                String dataUsername = dataSnapshot.child("username").getValue(String.class);

                Intent intent = new Intent(Main2Activity.this, Main5Activity.class);
                intent.putExtra("valueUID",dataUID);
                intent.putExtra("valueName", dataUsername);
                startActivity(intent);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, databaseError.getMessage());
            }
        };
        uidRef.addListenerForSingleValueEvent(valueEventListener);
    }
});

与其查询整个数据库以查找单个用户,不如浪费时间和资源,您可以使用其特定的用户uid获得该用户的引用。因此,无需使用getChildren()方法来遍历DataSnapshot对象,因为您可以简单地获得它而无需循环。的确,onDataChange()方法具有异步行为,所有与意图有关的代码都应放在回调中。如果要在外部使用这些值,建议您从此 post 中查看anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成。您也可以查看此 video 以获得更好的理解。