java - 访问 Firebase 中的项目数组
问题描述
我实际上有两个彼此相似的问题。我的问题的简要概述如下:
我正在开发的图书馆应用程序与书籍和作者具有一对多的关系,这意味着一本书可以有多个作者。示例作者和一本书作为图像附加。
Q1。如何搜索特定作者?对于只有一位作者的书,它总是有第零个索引。一本有多位作者的书怎么样?如果是这样,同一作者也可以存在于其他索引中。我想从特定作者那里获得所有书籍,我想知道最好的方法是什么?
Q2。如何查明作者名下是否有书籍。我实际上可以获取所有书籍并遍历它。但是,仅执行“EXISTS”操作就需要大量带宽。有没有简单的方法来做到这一点?
提前致谢!
解决方案
您可以迁移到 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(/* ... */);
如何查询作者名下是否有书籍?
要解决这个问题,您需要对对象使用exists()
方法DataSnapshot
。假设您使用的是名为 的模型类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 实时数据库不存储数组。你实际上拥有的是一个对象。请参阅此处的更多详细信息。
推荐阅读
- powershell - 如何从工作流并行代码块中获取值?
- python - 如何在 python2 和 python3 上运行代码
- python - 如何点击拒绝点击的可用按钮?
- apache-spark - 即席查询的 Impala 与 Spark 性能
- git - 从 https://git-scm.com/download/win 下载 Git 超级慢
- jquery - 如何防止填充传播到嵌入式表
- powershell - 如何在 Powershell 中搜索文件中的内容
- fasttext - fastText -autotune-validation 不起作用
- apache-spark - 为什么Spark在一个阶段后从文件中读取速度如此之快?
- angular - 为什么浏览器对 OPTION 请求得到 200 响应和 503 响应?