当前位置: 首页 > 知识库问答 >
问题:

访问Firebase中的项数组

长孙逸仙
2023-03-14

我实际上有两个问题彼此相似。我的问题的简要概述如下:

我正在开发的图书馆应用程序与书籍和作者有一对多的关系,这意味着一本书可以有许多作者。一个样本作者和一本书作为图像附上。

Q1.如何搜索特定作者?对于一本只有1个作者的书,它总是有第0个索引。一本有多个作者的书怎么样?如果是这样,相同的作者也可以存在于其他索引中。我想从一个特定的作者那里得到所有的书,我想知道什么是最好的方法?

共有1个答案

商开济
2023-03-14

您可以迁移到Cloud Firestore,但如果您已经在使用Firebase实时数据库,则可以实现这一点,但必须对数据库进行一些更改。

我想从一个特定的作者那里得到所有的书,我想知道什么是最好的方法?

不幸的是,您无法使用实际的数据库结构来实现您的目标。要从一个特定的作者那里获得所有的书籍,您应该考虑扩展您的数据结构以允许反向查找。这意味着您要创建一个名为books的新顶级集合,在该集合中,您应该将特定作者的所有书籍存储为book对象。数据库架构应如下所示:

Firebase-root
  |
  --- books
        |
        --- authorIdOne
              |
              --- bookIdOne
              |     |
              |     --- id: "bookIdOne"
              |     |
              |     --- nameInEnglish: "nameInEnglish"
              |     |
              |     --- nameInSinhalese: "nameInSinhalese"
              |
              --- bookIdTwo
                    |
                    --- id: "bookIdTwo"
                    |
                    --- nameInEnglish: "nameInEnglish"
                    |
                    --- nameInSinhalese: "nameInSinhalese"
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);
 类似资料:
  • 我有2个与firestore的firebase项目,让我们称他们为A和B,他们都有自己的web客户端。现在A web客户机需要读取B firestore数据库,所以我需要允许A客户机在B的某些集合下对firestore执行某些操作。是否有一种方法可以在使用firestore规则的同时使用B中A的身份验证数据来允许此类操作?。是否有一种方法可以将auth令牌从a链接到B中允许它们?。 任何机制都行得

  • 问题内容: 我试图在把手模板内的数组中指定项的索引: 使用这个: 如果上述方法不可行,我将如何编写一个可以访问数组中特殊项目的助手? 问题答案: 尝试这个:

  • 我有以下Firebase实时数据库连接到我的Flatter项目: 我对flutter和fire base相当陌生,我知道在我的flutter项目中访问此数据库中数据的一种方法是使用数据库引用变量。所以我有以下参考变量: 现在,如何使用此itemRef访问数据库中的温度和脉冲值?

  • 我目前有一个类似以下的数据库结构。如果无法在Firebase实时数据库安全规则中循环,我如何基于用户对多个组的访问来保护数据?要遵循的例子... 数据库结构: 我如何在上指定安全规则,以基于中指定的任何组与当前用户的

  • 我有一个由N条路径组成的数组,用于从firebase数据库中的不同位置检索数据。

  • 问题内容: Integer scores[] = new Integer[10]; int count = 0; 我有一些要输入的数据。我将其放在 onChildAdded中 ,但是如果我需要从数组 中获取onChildAdded之外的数据 ,控制台将显示 “ null” 。 如果我尝试将数组的数据放入 onChildAdded中 ,它将成功 重要时刻 例如,如果我将使用 FOR 我 不会为空 问