如何检索某些数据库子项并在ListView中显示

时间:2017-08-08 17:52:51

标签: java listview firebase firebase-realtime-database

How to retrieve/call userInfo from the following database, It is an authenticated user information

  

StudentInformation java class。

public class StudentInformation {

    String name;
    String ID;
    String studentID;
    String email;
    String phone_num;

    public StudentInformation() {

    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getID() {
        return ID;
    }

    public void setID(String ID) {
        this.ID = ID;
    }

    public String getStudentID() {
        return studentID;
    }

    public void setStudentID(String studentID) {
        this.studentID = studentID;
    }

    public String getEmail() {
        return email;
    }

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

    public String getPhone_num() {
        return phone_num;
    }

    public void setPhone_num(String phone_num) {
        this.phone_num = phone_num;
    }
}

我尝试了很多方法,但ListView仍然没有显示,应用程序突然停止了。

public class StudentInfoActivity extends AppCompatActivity {

    //add Firebase Database stuff
    private FirebaseDatabase mFirebaseDatabase;
    private FirebaseAuth mAuth;
    private FirebaseAuth.AuthStateListener mAuthListener;
    private DatabaseReference myRef;
    private  String userID;

    ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_student_info);

        mListView = (ListView) findViewById(R.id.listview);

        //declare the database reference object. This is what we use to access the database.
        //NOTE: Unless you are signed in, this will not be useable.
        mAuth = FirebaseAuth.getInstance();
        mFirebaseDatabase = FirebaseDatabase.getInstance();
        myRef = mFirebaseDatabase.getReference();
        FirebaseUser user = mAuth.getCurrentUser();
        userID = user.getUid();

        mAuthListener = new FirebaseAuth.AuthStateListener() {
            @Override
            public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
                FirebaseUser user = firebaseAuth.getCurrentUser();
                if (user != null) {
                    // User is signed in
                    toastMessage("User Information");
                } else {}
                // ...
            }
        }; //end authlistener

        myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.
                showData(dataSnapshot);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    } // end oncreate

    private void showData(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()){
        StudentInformation sInfo = new StudentInformation();

            sInfo.setName(ds.child(userID).child("userInfo").getValue(StudentInformation.class).getName());
            sInfo.setID(ds.child(userID).child("userInfo").getValue(StudentInformation.class).getID());
            sInfo.setStudentID(ds.child(userID).child("userInfo").getValue(StudentInformation.class).getStudentID());
            sInfo.setEmail(ds.child(userID).child("userInfo").getValue(StudentInformation.class).getEmail());
            sInfo.setPhone_num(ds.child(userID).child("userInfo").getValue(StudentInformation.class).getPhone_num());

            ArrayList<String> array  = new ArrayList<>();
            array.add(sInfo.getName());
            array.add(sInfo.getID());
            array.add(sInfo.getStudentID());
            array.add(sInfo.getEmail());
            array.add(sInfo.getPhone_num());
            ArrayAdapter adapter = new     ArrayAdapter(this,android.R.layout.simple_list_item_1,array);
        mListView.setAdapter(adapter);

        }
    } //end showdata

    @Override
    public void onStart() {
        super.onStart();
        mAuth.addAuthStateListener(mAuthListener);
    }

    @Override
    public void onStop() {
        super.onStop();
        if (mAuthListener != null) {
            mAuth.removeAuthStateListener(mAuthListener);
        }
    }

    private void toastMessage(String message){
        Toast.makeText(this,message,Toast.LENGTH_SHORT).show();
    }
} // end class

这是我使用的代码。我一直想知道getchildren方法,我在代码中做错了吗?任何人都可以帮我这个吗?

2 个答案:

答案 0 :(得分:0)

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

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference userInfoRef = rootRef.child("users").child(userID).child("userInfo");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String ID = ds.child("ID").getValue(String.class);
        String email = ds.child("email").getValue(String.class);
        String name = ds.child("name").getValue(String.class);
        String phone_num = ds.child("phone_num").getValue(String.class);
        String studentID = ds.child("studentID").getValue(String.class);
        Log.d("TAG", ID + " / " + email + " / " + name + " / " + phone_num + " / " + studentID);
    }

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

答案 1 :(得分:0)

您可以使用FirebaseListAdapter。这样您就不必管理任何更改或附加监听器,当服务器发生任何更改时,列表中的所有内容都会更新