【问题标题】:Issue in retrieving user data from firebase从 firebase 检索用户数据的问题
【发布时间】:2018-05-25 22:13:50
【问题描述】:

我正在尝试从用户内部存在数据的 firebase 数据库中获取数据。我想检索数据并将其放入模型类中。我想从firebase输出数据文本并将其通过电子邮件发送给用户,但在电子邮件中传递的值是空的。数据检索出现问题。

mAuth = FirebaseAuth.getInstance();
    mAuthListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull final FirebaseAuth firebaseAuth) {
            user = firebaseAuth.getCurrentUser();

                // User is signed in
                Log.d(TAG, "onAuthStateChanged:signed_in:" + user.getUid());

                database = FirebaseDatabase.getInstance().getReference().child("users/"+user.getUid()+"/delivery");
                ValueEventListener postListener = new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        post= dataSnapshot.getValue(RetrieveData.class);
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                };
                database.addValueEventListener(postListener);
        }
    };

RetrieveData.java

public class RetrieveData {
    private String city, country, email, postal, state, street, username;

    public RetrieveData(String city, String country, String email, String postal, String state, String street, String username) {
        this.city = city;
        this.country = country;
        this.email = email;
        this.postal = postal;
        this.state = state;
        this.street = street;
        this.username = username;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPostal() {
        return postal;
    }

    public void setPostal(String postal) {
        this.postal = postal;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }

    @Override
    public String toString() {
        return "RetrieveData{" +
                "city='" + city + '\'' +
                ", country='" + country + '\'' +
                ", email='" + email + '\'' +
                ", postal='" + postal + '\'' +
                ", state='" + state + '\'' +
                ", street='" + street + '\'' +
                ", username='" + username + '\'' +
                '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

Here is firebase database image.

【问题讨论】:

  • 到底是什么问题?同时显示你的数据库结构
  • 请添加您的数据库结构。
  • @PeterHaddad 我附上了数据库结构,你可以看看。
  • @AlexMamo 我附上了数据库结构,你可以看看。
  • 我在输出中得到空值,而不是用户名是 gursimran 和街道是 221b 街道等值

标签: android firebase firebase-realtime-database


【解决方案1】:

要获取该数据,请使用以下代码:

String uid = firebaseAuth.getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference deliveryRef = rootRef.child("users").child(uid).child("delivery");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String city = dataSnapshot.child("city").getValue(String.class);
        String country = dataSnapshot.child("country").getValue(String.class);
        String email = dataSnapshot.child("email").getValue(String.class);
        String postal = dataSnapshot.child("postal").getValue(String.class);
        String state = dataSnapshot.child("state").getValue(String.class);
        String street = dataSnapshot.child("street").getValue(String.class);
        String username = dataSnapshot.child("username").getValue(String.class);
        Log.d("TAG", city + " / " + 
                 country + " / " + 
                 email + " / " + 
                 postal + " / " + 
                 state + " / " + 
                 street + " / " + 
                 username);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
deliveryRef.addListenerForSingleValueEvent(eventListener);

拥有这些价值观,您可以随心所欲。

这是使用RetrieveData类对象的另一种方法:

String uid = firebaseAuth.getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference deliveryRef = rootRef.child("users").child(uid).child("delivery");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        RetrieveData retrieveData = dataSnapshot.getValue(RetrieveData.class);
        Log.d("TAG", retrieveData);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
deliveryRef.addListenerForSingleValueEvent(eventListener);

【讨论】:

  • 他有一个模型类,为什么要单独检索一个?
  • @PeterHaddad 还添加了另一种方法。
  • 感谢@PeterHaddad!
  • @AlexMamo 我想全局访问数据,但是当我执行 retriveData global 时,会找到空值。
  • 您不能只在全局范围内使用该数据,因为 onDataChange() 方法被称为异步。这意味着您只能在该方法中使用该数据。如果您想在该方法之外使用该数据,则需要深入异步世界并使用我在此question 中的回答。
【解决方案2】:
 DatabaseReference databaseReference = 
FirebaseDatabase.getInstance().getReference("Users");

     databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot snapshot) {

            for (DataSnapshot postSnapshot : snapshot.getChildren()) {
                //Getting the data from snapshot
                // user is a model class
                User person = postSnapshot.getValue(User.class);

                Log.e("Üser Deatils", String.valueOf(postSnapshot.getValue(User.class)));
              //  https://console.firebase.google.com/project/samplechat-611e3/database/samplechat-611e3/data
                //add person to your list
                registerUserArrayList.add(person);


            }
            linearLayoutManager = new LinearLayoutManager(UserActivity.this);
            recyclerView.setLayoutManager(linearLayoutManager);
            recyclerView.setHasFixedSize(true);
            registerUserAdpater = new RegisterUserAdpater(UserActivity.this,registerUserArrayList);
            recyclerView.setAdapter(registerUserAdpater);

        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
 });

 Hope its help you to retrieve your all user details.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 1970-01-01
    • 2017-11-11
    • 2017-01-15
    • 1970-01-01
    • 2019-12-24
    相关资源
    最近更新 更多