# #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()[«время»]» этого кода, он не работает. после первого() метода он не принимает [«время»] .