kotlin-firebase-получение соответствующих данных от ребенка, выбранного в счетчике - PullRequest
0 голосов
/ 27 октября 2019

Я использую kotlin и использую, и я пытаюсь получить данные из списка STATIC в базе данных на основе выбранного мной с помощью счетчика. У меня есть список, который содержит страны и их соответствующий континент. После того, как я выбрал страну, используя бланки с возможностью поиска, я могу успешно сохранить свой выбор в новом дочернем, скажем, выбранной стране. однако я хочу также восстановить континент, на котором он существует, и сохранить его в новом дочернем элементе. этот новый дочерний элемент становится частью другой функции, например, я объединяю данные для отображения в виде списка.

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

Мой узел Firebase выглядит следующим образом [спасибо Фрэнку за совет по обновлению дерева с использованием текста]

[ {
  "Continent" : "Europe",
  "Country" : "UK"
}, {
  "Continent" : "Europe",
  "Country" : "France"
}, {
  "Continent" : "Europe",
  "Country" : "Netherlands"
}, {
  "Continent" : "Europe",
  "Country" : "Spain"
}, {
  "Continent" : "Asia",
  "Country" : "India"
}, {
  "Continent" : "Asia",
  "Country" : "China"
}, {
  "Continent" : "Asia",
  "Country" : "Japan"
}, {
  "Continent" : "Asia",
  "Country" : "South Korea"
}, {
  "Continent" : "Africa",
  "Country" : "South Africa"
}, {
  "Continent" : "Africa",
  "Country" : "Egypt"
}, {
  "Continent" : "Africa",
  "Country" : "Nigeria"
}, {
  "Continent" : "Africa",
  "Country" : "Morocco"
} ]

Я пытался использовать следующий код, но он не работает:

lateinit var continentchosenRef:DatabaseReference
continentchosenRef=FirebaseDatabase.getInstance().getReference("location/continent")

    continentchosenRef.addValueEventListener(object: ValueEventListener {
        override fun onDataChange(dataSnapshot: DataSnapshot) {
            val continentchosen = dataSnapshot.getValue(location::class.java)
            continent = continentchosen.toString()
            //Update the UI with received data
        }

        override fun onCancelled(error: DatabaseError) {
            iFirebaseloaddone.onFirebaseLoadFailed(error.message)
        }
    })

в конечном итоге я хочу использовать указанную выше переменную континента, чтобы отправить строку новому дочернему элементу (который уже работает для страны, выбранной в счетчике).

Пожалуйста, помогите


Я попробовал следующее и заметил, что выбранная страна возвращает нулевую

continentRef=FirebaseDatabase.getInstance().reference
      val continentRef = continentchosenRef.child("location").orderByChild("country").equalTo(searchable_spinner_country.toString())


      continentchosenRef.addValueEventListener (object : ValueEventListener {

          override fun onDataChange(dataSnapshot: DataSnapshot) {
              for(ds in dataSnapshot.children){
     Log.d("spinner brand",searchable_spinner_country.selectedItem.toString())
                  val Continent = ds.child("Continent").getValue(String::class.java)
               val  continentselected = Continent.toString()

                  Log.d("Continent",continentselected)
              }
          }
          override fun onCancelled(databaseError: DatabaseError) {
              Log.d("continenterror","error on continent")
          }

      })

позицию в базе данных местоположения в первом узле:

{
  "location" : [ {
    "Continent" : "Europe",
    "Country" : "UK"
  }, {
    "Continent" : "Europe",
    "Country" : "France"
  }, {
    "Continent" : "Europe",
    "Country" : "Netherlands"
  }, {
    "Continent" : "Europe",
    "Country" : "Spain"
  }, {
    "Continent" : "Asia",
    "Country" : "India"
  }, {
    "Continent" : "Asia",
    "Country" : "China"
  }, {
    "Continent" : "Asia",
    "Country" : "Japan"
  }, {
    "Continent" : "Asia",
    "Country" : "South Korea"
  }, {
    "Continent" : "Africa",
    "Country" : "South Africa"
  }, {
    "Continent" : "Africa",
    "Country" : "Egypt"
  }, {
    "Continent" : "Africa",
    "Country" : "Nigeria"
  }, {
    "Continent" : "Africa",
    "Country" : "Morocco"
  } ]
}

Ответы [ 2 ]

0 голосов
/ 28 октября 2019

Я думаю, я понял это. часть вопроса была ответом выше, но это было больше связано с объявлением ссылки на базу данных, я изменяю ее следующим образом:

continentchosenRef=FirebaseDatabase.getInstance().reference
      val continentRef = continentchosenRef.child("location").orderByChild("country").equalTo(searchable_spinner_country.selectedItem.toString())


      continentRef.addValueEventListener (object : ValueEventListener {

решив, что я, кажется, столкнулся с последующей проблемой. Log.D теперь отображает выбранный континент:)

, но теперь, когда я пытаюсь использовать ссылку

continentselected

, она не позволяет мне использовать ее в операторе записи данных (примечаниеОтобранные тянет).

val summaryArray = countrySummaryArray(summayId.toString(),continentselected,countryselected)

, где была выбрана страна из поискового счетчика.

есть идеи, почему это будет?

0 голосов
/ 28 октября 2019

Единственная проблема, которая видна в вашем коде - это ваша ссылка. Предполагая, что searchable_spinner_country.toString() возвращает страну, такую ​​как France, измените следующую строку кода:

val continentRef = continentchosenRef.child("location")
    .orderByChild("country").equalTo(searchable_spinner_country.toString())

на

val continentRef = continentchosenRef.child("location")
    .orderByChild("Country").equalTo(searchable_spinner_country.toString())
//                 ^

Смотрите, я изменил строчную букву cс большой буквы C, так как в вашей базе данных хранится таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...