将文档 İD 作为字段添加到 firebase 文档

Adding document İD to firebase document as a field

我有一个带有默认值的模型。我的应用程序通过 EditTexts 从用户那里获取数据并将它们添加到 Firebase Firestore。我有一个 addData 函数(在 AddAnalyzeActivity 中)和 save 函数(在 AddAnalyzeViewModel 中)用于此操作。我在 AddAnalyzeActivity 中获取 EditText 条目并将它们添加到我的模型 但是 在这一步我想将文档 ID 添加到我的模型但我无法正确访问 documentIds在 AddAnalyzeActivity。当我尝试使用 retrieveData 函数(在 PairDetailVM 中)从 Firestore 检索提到的数据时,我只能使用 forEach 方法访问它们,但是如果我尝试在 retrieveData 方法中添加文档 ID,它只会添加默认值文档编号。

我尝试过的:

  1. 在我的模型中使用 @DocumentId 注释。

  2. 在我的模型中设置 documentId 的默认值为 null。

  3. 正在获取所有文档 ID 的列表,但无法将它们与实际项目匹配。

这是逻辑的屏幕截图:

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()
          }
    }
}

如果您想将文档 ID 保存到文档本身,请考虑使用 set 而不是 add 将新 DocumentReference 的创建与写入分开。

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()
        }
}

另请参阅 adding a document

文档中的第二个片段