如何通过Android应用将全新的字段添加到查询的Firestore(autoID)文档中

时间:2018-09-08 01:57:42

标签: java android firebase google-cloud-firestore

我正在制作一个Android应用,该应用可以让用户通过输入电话号码来查询数据库。返回的搜索带有与电话号码链接的用户名,非常类似于truecaller。

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

collection(“ contact”)---文档(自动生成的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) {  

    }
 });

如何最好地保存搜索电话号码的搜索者的用户名,以便每当有人搜索其电话号码时都可以通知电话号码的所有者?它应该看起来像这样:

collection(“联系人”)---文档(自动生成的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) {
                                }
                            });

database photo1 database photo2

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

1 个答案:

答案 0 :(得分:0)

由于您使用的是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