Android 将子Firebase数据库的子项获取到Listview

Android 将子Firebase数据库的子项获取到Listview,android,firebase,listview,firebase-realtime-database,Android,Firebase,Listview,Firebase Realtime Database,我正试图从firebase上的listview数据库中获取一个孩子的孩子。firebase结构如下所示:。 当我运行以下代码时,我的应用程序在启动该活动时崩溃。 我的代码如下: String TripIDD = intent.getStringExtra(AvailableRides.EXTRA_MESSAGE9); final DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();

我正试图从firebase上的listview数据库中获取一个孩子的孩子。firebase结构如下所示:。 当我运行以下代码时,我的应用程序在启动该活动时崩溃。 我的代码如下:

    String TripIDD = intent.getStringExtra(AvailableRides.EXTRA_MESSAGE9);

    final DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
    final DatabaseReference tripsRef = rootRef.child("Trips").child(TripIDD);
    ValueEventListener valueEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            List<String> passengers = new ArrayList<String>();
            ArrayAdapter adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1, passengers);
            ListView Passengers = (ListView) findViewById(R.id.passengerslist);
            for (final DataSnapshot ds : dataSnapshot.getChildren()) {
                String user = ds.child("Passengers on the ride").getValue(String.class);
                passengers.add(user);
                Passengers.setAdapter(adapter);
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };
}
String TripIDD=intent.getStringExtra(AvailableRides.EXTRA_MESSAGE9);
final DatabaseReference rootRef=FirebaseDatabase.getInstance().getReference();
最终数据库引用tripsRef=rootRef.child(“Trips”).child(TripIDD);
ValueEventListener ValueEventListener=新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
列表乘客=新的ArrayList();
ArrayAdapter=新的ArrayAdapter(getApplicationContext(),android.R.layout.simple\u list\u item\u 1,乘客);
ListView乘客=(ListView)findViewById(R.id.PassengerList);
对于(最终DataSnapshot ds:DataSnapshot.getChildren()){
String user=ds.child(“乘坐的乘客”).getValue(String.class);
乘客。添加(用户);
乘客。设置适配器(适配器);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
};
}

对于基本写入操作,可以使用setValue()将数据保存到指定的引用,替换该路径上的任何现有数据。您可以使用此方法来: 传递与可用JSON类型对应的类型,如下所示: 一串 长的 双重的 布尔值 地图 列表 如果定义自定义Java对象的类有一个默认构造函数,该构造函数不接受任何参数,并且具有要分配的属性的公共getter,则传递该对象。 例如,如果您有一个具有基本用户配置文件的应用程序,则您的用户对象可能如下所示:

public class User {
    public String username;
    public String email;
    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }
    public User(String username, String email) {
        this.username = username;
        this.email = email;
    }
}
private void writeNewUser(String userId, String name, String email) {
    User user = new User(name, email);
    mDatabase.child("users").child(userId).setValue(user);
}
可以使用setValue()添加用户,如下所示:

public class User {
    public String username;
    public String email;
    public User() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }
    public User(String username, String email) {
        this.username = username;
        this.email = email;
    }
}
private void writeNewUser(String userId, String name, String email) {
    User user = new User(name, email);
    mDatabase.child("users").child(userId).setValue(user);
}
然后像下面这样读

private FirebaseAuth mAuth;
    private DatabaseReference mUsersDBRef;
    private RecyclerView mRecyclerView;
    private RecyclerView.LayoutManager mLayoutManager;
    private UsersAdapter adapter;
    private List<User> mUsersList = new ArrayList<>();

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

        //assign firebase auth
        mAuth = FirebaseAuth.getInstance();
        mUsersDBRef = FirebaseDatabase.getInstance().getReference().child("Users");
        //initialize the recyclerview variables
        mRecyclerView = (RecyclerView)findViewById(R.id.usersRecyclerView);
        mRecyclerView.setHasFixedSize(true);
        // use a linear layout manager
        mLayoutManager = new LinearLayoutManager(this);
        mRecyclerView.setLayoutManager(mLayoutManager);
    }
    private void queryUsersAndAddthemToList(){
            mUsersDBRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    if(dataSnapshot.getChildrenCount() > 0){
                        for(DataSnapshot snap: dataSnapshot.getChildren()){
                            User user = snap.getValue(User.class);
                            //if not current user, as we do not want to show ourselves then chat with ourselves lol
                            try {
                                if(!user.getUserId().equals(mAuth.getCurrentUser().getUid())){
                                    mUsersList.add(user);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }

                    /**populate listview**/
                    adapter = new UsersAdapter(mUsersList, ChatUsersActivity.this);
        mRecyclerView.setAdapter(adapter);
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
私有FirebaseAuth mAuth;
私有数据库参考mUsersDBRef;
私人回收视图mRecyclerView;
private RecyclerView.LayoutManager MLLayoutManager;
私有用户适配器;
私有列表mUsersList=newarraylist();
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u chat\u用户);
//分配firebase身份验证
mAuth=FirebaseAuth.getInstance();
mUsersDBRef=FirebaseDatabase.getInstance().getReference().child(“用户”);
//初始化recyclerview变量
mRecyclerView=(RecyclerView)findViewById(R.id.usersRecyclerView);
mRecyclerView.setHasFixedSize(true);
//使用线性布局管理器
mLayoutManager=新的LinearLayoutManager(此);
mRecyclerView.setLayoutManager(mllayoutmanager);
}
私有无效查询服务和添加主题列表(){
mUsersDBRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
如果(dataSnapshot.getChildrenCount()>0){
对于(DataSnapshot快照:DataSnapshot.getChildren()){
User=snap.getValue(User.class);
//如果不是当前用户,因为我们不想显示自己,然后与自己聊天lol
试一试{
如果(!user.getUserId().equals(mAuth.getCurrentUser().getUid())){
mUsersList.add(用户);
}
}捕获(例外e){
e、 printStackTrace();
}
}
}
/**填充列表视图**/
adapter=newusersadapter(mUsersList,ChatUsersActivity.this);
mRecyclerView.setAdapter(适配器);
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}

要解决此问题,您需要查询数据库两次:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference tripsRef = rootRef.child("Trips");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String key = ds.getKey();

            DatabaseReference keyRef = tripsRef.child(key).child("Passengers on the ride");
            ValueEventListener eventListener = new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
                        String passenger = dSnapshot.getValue(String.class);
                        Log.d("TAG", passenger);
                    }
                }

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

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
tripsRef.addListenerForSingleValueEvent(valueEventListener);
输出将是来自所有行程的
乘坐乘客
节点内的所有乘客

如果您只想获得一次旅行的乘客,请使用以下代码:

String TripIDD = intent.getStringExtra(AvailableRides.EXTRA_MESSAGE9);
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child("Trips").child(TripIDD).child("Passengers on the ride");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String passenger = ds.getValue(String.class);
            Log.d("TAG", passenger);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
ref.addListenerForSingleValueEvent(valueEventListener);
其中,
TripIDD
是您想要获得的特定旅行的id(例如,
-L8wwgt3FeQjzAUeTJon
)。

嗨,Alex,你是我的储蓄者;)我有一个小问题,如果我只想得到一次旅行的乘客,那就是在字符串TripIDD中的旅行,该怎么办?