Как создать само поле автоматически сгенерированного идентификатора документа? - PullRequest
0 голосов
/ 05 мая 2020

Я хочу создать поле идентификатора документа, унаследовавшего это поле.

val fStore: FirebaseFirestore = FirebaseFirestore.getInstance()
                val currentUserId = FirebaseAuth.getInstance().currentUser!!.uid
                val post = Post(title, description , publisherId = currentUserId)
                fStore.collection("Posts")
                        .add(post)
                        .addOnSuccessListener{
                         Toast("Your post has been uploaded successfully.")
                        }

Как и в приведенном выше коде, я сделал поле currentUserId как publisherId, в других слова:

example of firestore

1 Ответ

2 голосов
/ 05 мая 2020

Есть два способа решить эту проблему. Можно было бы использовать currentUserId в качестве ключа документа, а затем использовать set() вместо add():

val fStore: FirebaseFirestore = FirebaseFirestore.getInstance()
val currentUserId = FirebaseAuth.getInstance().currentUser!!.uid
val post = Post(title, description , publisherId = currentUserId)
fStore.collection("Posts")
        .document(currentUserId)
        .set(post)
        .addOnSuccessListener{
            Toast("Your post has been uploaded successfully.")
        }

Это более распространенное решение, поскольку вы используете в качестве ключа документ - идентификатор пользователя, полученный в процессе аутентификации, а не случайный ключ. Второй вариант, который у вас есть, - использовать идентификатор, сгенерированный Firestore:

val fStore: FirebaseFirestore = FirebaseFirestore.getInstance()
val key = fStore.collection("Posts").document().id;
val post = Post(title, description , publisherId = key)
fStore.collection("Posts")
        .document(key)
        .set(post)
        .addOnSuccessListener{
            Toast("Your post has been uploaded successfully.")
        }

В обоих случаях, чтобы иметь одинаковое значение для идентификатора документа и для publisherId, вы должны использовать set () и не add (), потому что add () всегда генерирует случайный идентификатор при каждом вызове.

Edit:

set() делает то же самое, что и add(), с той лишь разницей, что вам нужно знать идентификатор, прежде чем использовать его. Итак, в вашем случае вам следует использовать второе решение.

Если вы хотите добавить только идентификатор сообщения в качестве свойства в свой документ, вам следует изменить свой класс Post, добавив другое поле с именем postId. Теперь, когда вы хотите создать новый объект Post и добавить его в свою базу данных, используйте следующие строки кода:

val fStore: FirebaseFirestore = FirebaseFirestore.getInstance()
val key = fStore.collection("Posts").document().id;
val post = Post(title, description , publisherId = key, postId) //postId added
fStore.collection("Posts")
        .document(key)
        .set(post)
        .addOnSuccessListener{
            Toast("Your post has been uploaded successfully.")
        }

Видите, я передал конструктору значение идентификатора документа. , который на самом деле является идентификатором сообщения. Теперь каждый раз, когда вы добавляете новую публикацию, у вас всегда будет идентификатор публикации как свойство вашего документа.

...