Как добавить совершенно новые поля в запрашиваемый документ Firestore (autoID) из приложения Android - PullRequest
0 голосов
/ 08 сентября 2018

Я создаю приложение для Android, которое позволяет пользователям запрашивать базу данных, вводя номер телефона. Поиск возвращается с именем пользователя, связанным с номером телефона, очень похоже на truecaller.

Вот как выглядит структура базы данных Firestore:

collection ("contact") --- документ (автоматически сгенерированный идентификатор) --- (field1 ("username"), 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 ("contact") --- документ (автоматически сгенерированный идентификатор) --- (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 имен пользователей, но оно продолжает удалять предыдущее и заменять его самым последним, поэтому в нем по-прежнему есть только один идентификатор пользователя.

1 Ответ

0 голосов
/ 10 сентября 2018

Добавляет новый документ, потому что вы используете метод CollectionReference add () :

Добавляет новый документ в эту коллекцию с указанным POJO в качестве содержимого, назначая емуИдентификатор документа автоматически.

Вместо использования метода 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...