У меня есть модель со значениями по умолчанию. Мое приложение получает данные от пользователя через EditTexts и добавляет их в Firebase Firestore. У меня есть функция addData
(в AddAnalyzeActivity
) и функция save
(в AddAnalyzeViewModel
) для этой операции. Я получаю записи EditText в AddAnalyzeActivity
и добавляю их в свою модель но на этом этапе. Я хочу добавить идентификатор документа в свою модель, но не могу правильно получить доступ к идентификаторам документа в AddAnalyzeActivity
. Я могу получить к ним доступ только с помощью метода forEach, когда пытаюсь получить упомянутые данные с помощью функции retrieveData
(в PairDetailVM) из Firestore, но если я пытаюсь добавить идентификаторы документов в метод retrieveData
, он добавляет только значение по умолчанию для documentId.
Что я пытался:
Использование аннотации @DocumentId
в моей модели.
Установка нулевого значения по умолчанию для documentId в моей модели.
Получение списка идентификаторов всех документов, но не может сопоставить их с фактическими элементами.
Вот скриншот для логики:
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()
}
}
}
Если вы хотите сохранить идентификатор документа в самом документе, рассмотрите возможность отделения создания нового 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()
}
}
Также см. второй фрагмент в документации по добавление документа.