从Firebase数据库中检索带有子级的数据,并使用Kotlin填充对象类

时间:2018-11-04 22:20:46

标签: firebase firebase-realtime-database kotlin data-retrieval auto-populate

如何从Firebase数据库中检索带有child *的数据并填充User对象类。

Firebase示例:

  • 用户
      uid:131232
      • 名字:约翰
      • 姓氏:Doe
      • 位置
        • lat *:15.2512312
        • lon *:-12.1512321
      • 聊天
        • -k1231 *:是
        • -k1285 *:是

,并且在检索到可以使用的数据后,即: User.firstName User.location.lat 等。

谢谢。

2 个答案:

答案 0 :(得分:1)

您最好的选择是创建多个自定义类:

class User {
  public String firstName;
  public String lastName;
  public UserLocation location;
}

...

class UserLocation {
   public double lat;
   public double lon;
}

然后,您可以将整个序列反序列化为User

答案 1 :(得分:1)

正如萨姆·斯特恩(Sam Stern)在回答中提到的那样,最好为每个类分别创建一个表示形式。我将在Kotlin中为您编写相应的类。

这是User类:

class User (
    val firstName: String = "",
    val lastName: String = "",
    val userLocation: UserLocation? = null
)

这是UserLocation类:

class UserLocation (
        val lat: Int = 0,
        val lng: Int = 0
)
  

查询该用户1332并将其强制转换为User.class对象

请使用以下代码行:

val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val uidRef = rootRef.child("users").child(uid)
val valueEventListener = object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        val user = dataSnapshot.getValue(User::class.java)
        Log.d(TAG, "Lat/Lng: " + user!!.userLocation!!.lat + ", " + user.userLocation!!.lng);
    }

    override fun onCancelled(databaseError: DatabaseError) {
        Log.d(TAG, databaseError.message) //Don't ignore errors!
    }
}
uidRef.addListenerForSingleValueEvent(valueEventListener)

其中uid的值应为131232。您的logcat中的输出将是:

Lat/Lng: 15.2512312, -12.1512321

您可以通过相同的方式获得:user!!.firstNameuser!!.lastName