首页 > 解决方案 > 如何从 Android 应用程序向查询的 Firestore (autoID) 文档添加全新字段

问题描述

我正在制作一个 Android 应用程序,允许用户通过输入电话号码来查询数据库。搜索返回的用户名与电话号码相关联,很像 truecaller。

这是 Firestore 数据库结构当前的样子:

集合(“联系人”)---文档(自动生成的 ID)---(field1(“用户名”),field2(“phoneNum”))

这是我的代码:

CollectionReference collectionReference = db.collection("contact");
Query query = collectionReference.whereEqualTo("phoneNum",phonesearch);
query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>(){
      @Override
      public void onComplete(@NonNull Task<QuerySnapshot> task){
      if (task.isSuccessful()) {
      for (DocumentSnapshot document:task.getResult()){

      username = document.getString("username");
      phonenum = document.getString("phonenum");

      //storing the searcher username in the database
      Map<String, String> Usermap = new HashMap<>();
      searcher = user.getDisplayName();
      Usermap.put("searcher", searcher);
      db.collection("contact").add(Usermap).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
      @Override
      public void onSuccess(DocumentReference documentReference) {  

    }
 });

我怎样才能最好地保存搜索电话号码的搜索者的用户名,以便电话号码的所有者可以在有人搜索他们的号码时得到通知?它应该如下所示:

集合(“联系人”)---文档(自动生成的ID)---(field1(“用户名”),field2(“电话号码”),field3(“searcher1”),field4(“searcher2”),.. ...fieldN("searcher3"))

目前它创建了一个全新的文档。我不希望它这样做,我只想将新字段(搜索器)添加到现有文档中。

其他解决方案也将不胜感激。谢谢。

................................................这是更改后的样子,它用最新的搜索者用户名覆盖以前的搜索者用户名,而不是用最新的搜索者用户名更新列表。

Map<String, Object> Usermap = new HashMap<>();
searcher = user.getDisplayName();
Usermap.put("searcher", searcher);
db.collection("contact").document(document.getId()).update(Usermap).addOnSuccessListener(new OnSuccessListener<Void>() {
                                @Override
                                public void onSuccess(Void aVoid) {
                                }
                            });

数据库照片1 数据库照片2

第二个屏幕截图可能看起来令人困惑……这是因为字段是按字母顺序排列的。Searcher 字段是一种数组类型,现在它应该有大约 3 个用户名,但它会不断删除前一个用户名并用最新的用户名替换它,这就是为什么它仍然只有一个用户 ID。

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


它添加了一个新文档,因为您使用的是 CollectionReference 的add()方法:

以指定的 POJO 作为内容向此集合添加一个新文档,并自动为其分配一个文档 ID。

而不是使用 DocumentReference 的update()方法:

更新此 DocumentReference 引用的文档中的字段。

所以为了解决这个问题,请更改以下代码行:

db.collection("contact").add(Usermap).addOnSuccessListener

db.collection("contact").document(document.getId()).update(String.valueOf(Usermap), searches).addOnSuccessListener(/* ... */);

要存储这些搜索,我建议您创建另一个名为的对象(地图)searches并将所有这些搜索存储在它下面。不要将每个搜索存储为单独的属性。您的架构应如下所示:

Firestore-root
   |
   --- contact (collection)
         |
         --- autoGeneratedId (document)
                |
                --- username: "User Name"
                |
                --- phoneNumber: +123456789
                |
                --- searches
                      |
                      --- searcher1: true
                      |
                      --- searcher2: true

还有一种方法可以将所有这些搜索存储到array. 这是您的数据库结构应如下所示:

Firestore-root
   |
   --- contact (collection)
         |
         --- autoGeneratedId (document)
                |
                --- username: "User Name"
                |
                --- phoneNumber: +123456789
                |
                --- searches: ["searcher1", "searcher2"]

请记住,此解决方案只有在您存储有限数量的搜索时才能正常工作。如果您认为文档可以容纳的搜索次数会多得多,在这种情况下,请考虑创建一个搜索集合,如下所示:

Firestore-root
   |
   --- contact (collection)
         |
         --- autoGeneratedId (document)
                |
                --- username: "User Name"
                |
                --- phoneNumber: +123456789
                |
                --- searches (collection)
                      |
                      --- searcher1 (document)
                      |       |
                      |       --- //details
                      |
                      --- searcher2 (document)
                              |
                              --- //details

推荐阅读