Android 将子Firebase数据库的子项获取到Listview
我正试图从firebase上的listview数据库中获取一个孩子的孩子。firebase结构如下所示:。 当我运行以下代码时,我的应用程序在启动该活动时崩溃。 我的代码如下: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();
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中的旅行,该怎么办?