Добавление идентификатора документа в документ firebase в качестве поля

У меня есть модель со значениями по умолчанию. Мое приложение получает данные от пользователя через EditTexts и добавляет их в Firebase Firestore. У меня есть функция addDataAddAnalyzeActivity) и функция saveAddAnalyzeViewModel) для этой операции. Я получаю записи EditText в AddAnalyzeActivity и добавляю их в свою модель но на этом этапе. Я хочу добавить идентификатор документа в свою модель, но не могу правильно получить доступ к идентификаторам документа в AddAnalyzeActivity. Я могу получить к ним доступ только с помощью метода forEach, когда пытаюсь получить упомянутые данные с помощью функции retrieveData (в PairDetailVM) из Firestore, но если я пытаюсь добавить идентификаторы документов в метод retrieveData, он добавляет только значение по умолчанию для documentId.

Что я пытался:

  1. Использование аннотации @DocumentId в моей модели.

  2. Установка нулевого значения по умолчанию для documentId в моей модели.

  3. Получение списка идентификаторов всех документов, но не может сопоставить их с фактическими элементами.

Вот скриншот для логики:

Добавление идентификатора документа в документ firebase в качестве поля

AnalyzeModel:

data class AnalyzeModel(
var concept: String? = "",
var reason: String? = "",
var result: String? = "",
var rrRatio: Double?=0.0,
var tarih: Timestamp=Timestamp.now(),
var tradingViewUrl: String = "",
var id : String = "")

addData :

fun addData(view: View) {

    val tarih = com.google.firebase.Timestamp.now()
    val rr = rrText.text.toString()
    var doubleRR = rr.toDoubleOrNull()
    if (doubleRR == null) { doubleRR = 0.0 }

    val analyzeDTO = AnalyzeModel(
        conceptText.text.toString(),
        reasonForText.text.toString(),
        resultAddingText.text.toString(),
        doubleRR,
        tarih,
        chartImage.text.toString()
    )
    viewModel.save(analyzeDTO)

    val intent = Intent(this, PairDetailActivity::class.java)
    startActivity(intent)
    finish()
}

save :

    fun save(data: AnalyzeModel) {

    database.collection(dbCollection!!).document("Specified").collection("Pairs")
        .document(chosenPair!!)
        .collection("Analysis")
        .add(data)
        .addOnFailureListener { exception ->
            exception.printStackTrace()
            Toast.makeText(getApplication(), exception.localizedMessage, Toast.LENGTH_LONG).show()
        }
}

retrieveData:

    private fun retrieveData() {

    val docRef = collectionRef.orderBy("tarih", Query.Direction.DESCENDING)
    docRef.addSnapshotListener { value, error ->
        try {
            if (value != null && !value.isEmpty) {
                val allAnalysis= ArrayList<AnalyzeModel>()
                val documents = value.documents
                documents.forEach {
                    val analyze = it.toObject(AnalyzeModel::class.java)
                    if (analyze!=null){

                        allAnalysis.add(analyze)
                    }
                }

                list.value = allAnalysis
            } else if (error != null) {
                Toast.makeText(Application(), error.localizedMessage, Toast.LENGTH_LONG).show()
            }
        } catch (e: Exception) {
            e.printStackTrace()
          }
    }
}
Интеграция Angular - Firebase Analytics
Интеграция Angular - Firebase Analytics
Узнайте, как настроить Firebase Analytics и отслеживать поведение пользователей в вашем приложении Angular.
0
0
19
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите сохранить идентификатор документа в самом документе, рассмотрите возможность отделения создания нового DocumentReference от записи в него, используя `` вместо add.

fun save(data: AnalyzeModel) {

    val newRef = database.collection(dbCollection!!).document("Specified").collection("Pairs")
        .document(chosenPair!!)
        .collection("Analysis")
        .document()     // ? generates a new reference with a unique ID

    data.id = newRef.id // ? set the ID into your object

    newRef.set(data)    // ? writes the data to the new reference
        .addOnFailureListener { exception ->
            exception.printStackTrace()
            Toast.makeText(getApplication(), exception.localizedMessage, Toast.LENGTH_LONG).show()
        }
}

Также см. второй фрагмент в документации по добавление документа.

Другие вопросы по теме