【问题标题】:Firebase -- Document references must have an even number of segments, but Rezepte has 1Firebase -- 文档引用必须有偶数个段,但 Rezepte 有 1
【发布时间】:2021-01-12 03:40:15
【问题描述】:

好的,所以我生成了一个文档的随机名称,现在我正在尝试从该文档中获取数据。

        namereference
                .get()
                .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                    @Override
                    public void onSuccess(DocumentSnapshot documentSnapshot) {
                        if (documentSnapshot.exists()){
                            String names = documentSnapshot.get("dokumentnamen").toString().replace("[", "").replace("]", "");
                            String [] namelist = names.split(", ");
                            Random random = new Random();
                            int randomNumber = random.nextInt(namelist.length);
                            randomrezeptname = namelist[randomNumber];

                        }
                    }
                });
    } 

生成一个随机名称可以正常工作并且该名称存在。 但现在我试图在另一个 void 内的 DocumentReference 中使用该字符串,但它根本不起作用。

DocumentReference documentReference = db.collection("Rezepte").document(this.randomrezeptname);

我总是遇到同样的错误:

无效的文档参考。文档引用必须有偶数个段,但 Rezepte 有 1 个

我尝试使用 String 的内容并将其直接放在 DocumentReference 中并且它有效。但我必须使用一个变量,因为它应该显示一个随机文档。 任何想法我做错了什么?

【问题讨论】:

  • 你的随机字符串中有特殊字符吗?
  • @s_o_m_m_y_e_e 不,它没有。纯文本
  • 基本上,错误是因为在 Firestore 中数据是分层的。您只能在一个集合(而不是任何集合)中拥有一个文档,并且只能在一个文档(而不是任何其他文档)中拥有一个集合。所以按照这个顺序,你的文档应该总是在层次结构中的偶数。
  • @s_o_m_m_y_e_e 是的,但我只有一个包含数据文档的集合。就这样。所以不知道哪里可能有层次问题……

标签: java android firebase android-studio google-cloud-firestore


【解决方案1】:

我猜你说的时候

我尝试使用 String 的内容并将其直接放在 DocumentReference 中并且它起作用了

你的意思是你跑了

DocumentReference documentReference = db.collection("Rezepte").document("a_random_recipe_name");

它起作用了,表明你的层次结构很好。

您确定随机名称生成器在您尝试使用它访问随机文档之前实际上设置了randomrezeptname?我的意思是说,如果你跑:

1) namereference.get().addOnSuccessListener(OnSuccessListener);
2) System.out.println(this.randomrezeptname)
3) DocumentReference documentReference = db.collection("Rezepte").document(this.randomrezeptname)

第 2 行和第 3 行可能会在 OnSuccessListener 运行之前运行,这意味着在 OnSuccessListener 设置之前,无论randomrezeptname 是什么,你都会有一些奇怪的行为。 OnSuccessListener 稍后在主线程上运行,但在异步方法返回之后。

【讨论】:

  • 我有一个获取随机名称的函数和另一个使用该名称的函数。我在 onCreate 方法中都调用了它们。现在我只调用函数获取一个随机名称。我在 onCreate 方法中调用的函数的 onSuccessListener 中调用另一个函数。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-24
  • 2018-11-12
  • 2021-09-09
  • 2020-06-26
相关资源
最近更新 更多