У меня есть класс данных 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 }
Установка идентификатора нового объекта в идентификатор документа.