как считывать отображенные данные из firestore в котлине

# #android #firebase #kotlin #google-cloud-platform #google-cloud-firestore

Вопрос:

Я пытаюсь прочитать отображенные данные из Firestore. Я читаю данные, но не знаю, как добраться до одного из ключей на карте.

это сопоставленные данные

 dbSaveAvailableTimes.addSnapshotListener { snapshot, e -gt;  if (snapshot != null amp;amp; snapshot.exists()) {  val chaplainAvailableTimes = snapshot.data  if (chaplainAvailableTimes != null) {  Log.d("chaplainAvailableTimes", chaplainAvailableTimes.toString())  }  

Я прочитал данные здесь.

D/Капеллан доступно время: {1637868400000={Идентификатор пациента=null, забронирован=ложь, время=1637868400000}, 1637863200000={Идентификатор пациента=null, забронирован=ложь, время=1637863200000}}

Я получаю такие результаты в журнале.

когда я пытаюсь chaplainAvailableTimes["time"] , я получаю ноль.

Итак, как я могу получить ключевые данные времени после этого? Я не знаком с картой в Котлине. заранее спасибо за вашу помощь?

Комментарии:

1. Пожалуйста, отредактируйте свой вопрос и добавьте структуру своей базы данных в виде скриншота.

2. привет, я добавил скриншот. если вы нажмете «это сопоставленные данные», вы увидите структуру базы данных. Спасибо

3. Итак, чтобы лучше понять, вы хотите прочитать значение «времени», которое существует под каждым объектом, верно?

4. привет, да. Спасибо

5. @kadiryapar Вам нужен список этих time s, так как их много, или только первый?

Ответ №1:

Согласно моему последнему вопросу:

Итак, чтобы лучше понять, вы хотите прочитать значение «времени», которое существует под каждым объектом, верно?

И твой последний ответ:

привет, да. Спасибо

Чтобы получить значения «времени» внутри каждого объекта, пожалуйста, используйте следующие строки кода:

 val db = FirebaseFirestore.getInstance() val availableTimesRef = db.collection("chaplainTimes").document("availableTimes") availableTimesRef.get().addOnCompleteListener {  if (it.isSuccessful) {  val data = it.result.data  data?.let {  for ((key, value) in data) {  val v = value as Maplt;*, *gt;  val time = v["time"]  Log.d(TAG, "$key -gt; $time")  }  }  } }  

Результатом в logcat будет:

 1637863200000 -gt; 1637863200000 1637868400000 -gt; 1637868400000  

Ответ №2:

Вы можете получить список time s, используя этот код:

 // This will be a Listlt;Stringgt; val timeList = snapshot.data.values.map { (it as Maplt;*, *gt;)["time"] as String }  
  • snapshot.data возвращает изменяемую картуlt;Строка,любаяgt;
  • .values возвращает коллекцию значений карты Collectionlt;Anygt;
  • .map преобразует каждое значение, чтобы получить Listlt;Stringgt;
  • внутри map мы приводим каждое значение к общей карте Maplt;*,*gt; , получаем значение для ключа time и приводим его к String

Ответ №3:

Попробуйте бросить chaplainAvailableTimes как val theData = chaplainAvailableTimes as? HashMaplt;*, *gt; . После этого вы сможете повторить его или получить данные следующим образом:

 theData.values.first().get("time") // returns 1637868400000  

Комментарии:

1. здравствуйте, я пробовал, но он все равно возвращает значение null. Кроме того, нет выбора .сначала[ ]. Что ты хочешь этим сказать? Спасибо

2. Попробуйте принудительно привести его ( as , без ? ) и опубликуйте сообщение об ошибке здесь. Если приведение будет успешным, результатом должна быть карта. Карта имеет свойство .values.first, которое возвращает первый элемент (то же, что и значения.[0]). Я обновил код для карты (раньше был для массива, извините).

3. здравствуйте, метод «theData.values.first ()» доступен, но метод » theData.values.first[«время»] » недоступен. ‘theData.values.first()’ этот метод возвращает первый элемент массива, который является {patientUid=null, isBooked=false, время=1637868400000}. Я хочу найти ключ времени под каждым объектом. спасибо за вашу поддержку.

4. Я обновил код, чтобы получить время. Проверьте основной ответ.

5. привет, если вы имеете в виду обновление «theData.values.first()[«время»]» этого кода, он не работает. после первого() метода он не принимает [«время»] .