Как получить имена соседних пользователей в Android, используя FireBase в качестве базы данных? - PullRequest
0 голосов
/ 02 февраля 2019

Я добавил скриншот моей базы данных Firebase ниже. Я использую geofire для получения местоположения соседних пользователей, которое хранится в электрике. Доступно. Я использовал адаптер, чтобы показать список соседних пользователей в пользовательском интерфейсе, и я могупоказать ключи, хранящиеся в электрике. Доступно.

Но я не хочу показывать ключи, а вместо этого хочу показать имена пользователей (например: -san@gmail.com). Я застрял с этимдавно, пожалуйста, может кто-нибудь сказать мне, как отобразить имена соседних имен пользователей в форме списка?

Ниже я приложил свой скриншот и код. Он обновляет значение электрика до истинного в дБ, но имя электрикапоказывает пустой в списке. Ниже я загрузил скриншот и код.

fun getElectriciansAround(){
        getElectriciansArounStarted = true
        val customerId: String = FirebaseAuth.getInstance().currentUser!!.uid
        val driversLocation:DatabaseReference=FirebaseDatabase.getInstance().reference.child("electricianAvailable")
        val geofire:GeoFire= GeoFire(driversLocation)
        val geoQuery:GeoQuery = geofire.queryAtLocation(GeoLocation(mLastLocation.latitude,mLastLocation.longitude), 10000.0)

        geoQuery.addGeoQueryEventListener(object : GeoQueryEventListener{

            override fun onKeyEntered(key: String?, location: GeoLocation?) {
                val electricianRef:DatabaseReference=FirebaseDatabase.getInstance().reference.child("users").child("Electricians").child(key!!)



                driversLocation.addListenerForSingleValueEvent(object :ValueEventListener{
                    override fun onCancelled(p0: DatabaseError) {
                        TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
                    }

                    override fun onDataChange(dataSnapshot: DataSnapshot) {
                        if(dataSnapshot.exists() && dataSnapshot.childrenCount>0){
                            for(i in 0 until dataSnapshot.childrenCount){
                                electricianRef.child(customerId).setValue(true)
                                getDriverName("Electricians",key!!)
                                electricianNames= arrayOf(mElectricianName)
                                val adapter= ArrayAdapter(this@CustomerElectricianHome, android.R.layout.simple_expandable_list_item_1, electricianNames)
                                mListViewElectricians.adapter=adapter
                            }
                        }
                    }

                })
 Run code snippet

var mElectricianName:String=""

    private fun getDriverName(ElectricianName: String, key: String) {
        val mDriverNameDb:DatabaseReference=FirebaseDatabase.getInstance().reference.child("users").child(ElectricianName).child(key)
        mDriverNameDb.addListenerForSingleValueEvent(object :ValueEventListener{
            override fun onCancelled(p0: DatabaseError) {

            }

            override fun onDataChange(dataSnapshot: DataSnapshot) {
                if(dataSnapshot.exists()){
                    val map:Map<*,*> = dataSnapshot.value as Map<*,*>
                    if(map["name"]!=null){
                        mElectricianName= map["name"].toString()
                    }

                }
            }

        })



    }

[[введите описание изображения здесь] 1]

1 Ответ

0 голосов
/ 02 февраля 2019

Вам нужно будет найти дополнительные пользовательские данные с дополнительным чтением из базы данных Firebase Realtime из метода GeoQueryEventListener.onKeyEntered.

Что-то вроде:

geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
    @Override
    public void onKeyEntered(String key, GeoLocation location) {
        System.out.println(String.format("Key %s entered the search area at [%f,%f]", key, location.latitude, location.longitude));
        DatabaseReference electriciansRef = FirebaseDatabase.getInstance().getReference("users/Electricians");
        electriciansRef.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                String name = dataSnapshot.child("name").getValue(String.class);
                System.out.println(String.format("Electrician name: %s", name));
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException();
            }
        })
    }

    ...

    @Override
    public void onGeoQueryError(DatabaseError error) {
        System.err.println("There was an error with this query: " + error);
    }
});

Илив Котлине:

geoQuery.addGeoQueryEventListener(object:GeoQueryEventListener() {
  fun onKeyEntered(key:String, location:GeoLocation) {
    println(String.format("Key %s entered the search area at [%f,%f]", key, location.latitude, location.longitude))
    val electriciansRef = FirebaseDatabase.getInstance().getReference("users/Electricians")
    electriciansRef.child(key).addListenerForSingleValueEvent(object:ValueEventListener() {
      fun onDataChange(dataSnapshot:DataSnapshot) {
        val name = dataSnapshot.child("name").getValue(String::class.java)
        println(String.format("Electrician name: %s", name))
      }
      fun onCancelled(databaseError:DatabaseError) {
        throw databaseError.toException()
      }
    })
  }

  ...

  fun onGeoQueryError(error:DatabaseError) {
    System.err.println("There was an error with this query: " + error)
  }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...