您可以迁移到 Cloud Firestore,但如果您已经在使用 Firebase 实时数据库,则可以实现此目的,但不能在您的数据库中进行一些更改。
我想从特定作者那里获得所有书籍,我想知道最好的方法是什么?
不幸的是,您无法使用实际的数据库结构来实现您的目标。要从特定作者那里获取所有书籍,您应该考虑扩充您的数据结构以允许反向查找。这意味着您要创建一个名为books 的新顶级集合,您应该在其中将特定作者的所有书籍存储为book 对象。您的数据库架构应如下所示:
Firebase-root
|
--- books
|
--- authorIdOne
|
--- bookIdOne
| |
| --- id: "bookIdOne"
| |
| --- nameInEnglish: "nameInEnglish"
| |
| --- nameInSinhalese: "nameInSinhalese"
|
--- bookIdTwo
|
--- id: "bookIdTwo"
|
--- nameInEnglish: "nameInEnglish"
|
--- nameInSinhalese: "nameInSinhalese"
要从特定作者那里获取所有书籍,您需要在其 id (authorIdOne) 上附加一个侦听器并遍历其子级。
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference yourRef = authorIdOneRef.child("books").child(authorIdOne);
authorIdOneRef.addListenerForSingleValueEvent(/* ... */);
如何查询作者名下是否有书?
要解决这个问题,您需要在DataSnapshot 对象上使用exists() 方法。假设您使用的是名为Book 的模型类,请查看以下代码行:
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
Book book = ds.getValue(Book.class);
Log.d("TAG", book.getNameInEnglish());
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
};
authorIdOneRef.addListenerForSingleValueEvent(valueEventListener);
但同样的事情可以使用 String 类来实现。
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String nameInEnglish = ds.child("nameInEnglish").getValue(String.class);
Log.d("TAG", nameInEnglish);
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {}
};
authorIdOneRef.addListenerForSingleValueEvent(valueEventListener);
请注意,Firebase 实时数据库不存储数组。你实际上拥有的是一个对象。详情请见here。