【问题标题】:How to get the nearby user names in android using firebase as database?如何使用firebase作为数据库在android中获取附近的用户名?
【发布时间】:2019-02-02 23:54:43
【问题描述】:

我在下面添加了我的 firebase 数据库的屏幕截图。我正在使用 geofire 来获取存储在电工可用的附近用户位置 lat/lng。我已经使用适配器在 ui 中显示附近用户的列表,我能够显示存储在electriciansAvailable 中的密钥。

但我不想显示密钥,而是想显示用户的姓名(例如:-san@gmail.com)。我被这个问题困扰了很长时间,请有人告诉我怎么做以列表形式显示附近用户名的名称?

下面我附上了我的截图和代码。它将电工值在 db 中更新为 true,但电工名称在列表视图中显示为空白。下面我上传了截图和代码。

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()
                    }

                }
            }

        })



    }

[[在此处输入图片描述]

【问题讨论】:

    标签: android firebase firebase-realtime-database kotlin


    【解决方案1】:

    您需要在 GeoQueryEventListener.onKeyEntered 方法内部通过从 Firebase 实时数据库中额外读取来查找其他用户数据。

    类似:

    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);
        }
    });
    

    或者在 Kotlin 中:

    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)
      }
    })
    

    【讨论】:

    • 不要发布其他问题作为答案。相反,请单击您问题下方的编辑链接并在此处添加信息。还请限制您的问题范围,并明确说明什么不起作用。最后:请务必从我的答案中复制正确的代码,因为据我所知,您没有将侦听器附加到 electricianRef
    • 我在上面的另一个函数getDriverName()中添加了监听器,对吗?
    • 如果您使用我的确切代码,当电工在地理查询范围内时,它应该记录电工的姓名。您的代码在某些地方完全不同,我不能说这是否正确。
    • 我是 android 新手,所以我可能弄乱了代码。它现在可以工作了!!感谢加载!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-16
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多