Как получить идентификатор документа для документа Firestore с использованием классов данных kotlin

У меня есть класс данных kotlin

data class Client( val name: String = "", val email: String = "", val phone: String ="") { constructor():this("","","")} 

У меня есть firestore, которые заполняют данные в классе просто отлично, однако я затрудняюсь выяснить, как получить идентификатор документа в классе данных, не устанавливая его в самом документе. Это возможно?

Да, можно получить идентификатор, не сохраняя его, используя DocumentSnapshot . Здесь я попытаюсь привести здесь полные примеры.

Я создал общий класс модели для хранения id:

 @IgnoreExtraProperties public class Model { @Exclude public String id; public <T extends Model> T withId(@NonNull final String id) { this.id = id; return (T) this; } } 

Затем вы расширяете его с помощью любой модели, не нужно ничего реализовывать:

 public class Client extends Model 

Если у меня есть список клиентов, пытаясь запросить список, чтобы получить только клиентов с age == 20 :

 clients.whereEqualTo("age", 20) .get() .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() { @Override public void onComplete(@NonNull Task<QuerySnapshot> task) { if (task.isSuccessful()) { for (DocumentSnapshot documentSnapshot : task.getResult().getDocuments()) { // here you can get the id. Client client = document.toObject(client.class).withId(document.getId()); // you can apply your actions... } } else { } } }); 

И если вы используете EventListener , вы также можете получить идентификатор, как EventListener ниже:

 clients.addSnapshotListener(new EventListener<QuerySnapshot>() { @Override public void onEvent(QuerySnapshot documentSnapshots, FirebaseFirestoreException e) { for (DocumentChange change : documentSnapshots.getDocumentChanges()) { // here you can get the id. Client client = document.toObject(client.class).withId(document.getId()); // you can apply your actions... } } }); 

documentSnapshot.getId()) предоставит вам идентификатор документа в коллекции без сохранения идентификатора в документе.

Использование модели не позволит вам редактировать любую из ваших моделей и не забывайте использовать @IgnoreExtraProperties

Вот как я решил проблему.

 data class Client( val name: String = "", val email: String = "", val phone: String ="", @get:Exclude var id: String = "") { constructor():this("","","") } 

Я использую @get: Исключить идентификатор, чтобы убедиться, что идентификатор не отправлен в Firestore при сохранении, а затем, когда вы выбираете список клиентов:

 snapshot.documents.mapTo(list) { var obj = it.toObject(Client::class.java) obj.id = it.id obj } 

Установка идентификатора нового объекта в идентификатор документа.