【问题标题】:Retrieve data with child from Firebase Database and Populate Object Class using Kotlin使用 Kotlin 从 Firebase 数据库和填充对象类中检索包含子项的数据
【发布时间】:2019-04-08 07:44:37
【问题描述】:

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

Firebase 示例:

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

在检索到能够使用的数据后,例如:User.firstNameUser.location.lat

提前谢谢你。

【问题讨论】:

  • 为了更好地理解,您想查询数据库中k1231 等于true 的所有对象?
  • 我的朋友@Alex-Mamo,这是一个 Firebase 数据库模型。我只想查询这个 User 1332 并将其转换为应用程序内的 User.class 对象以使用该对象。我的主要疑问是知道如何创建类 User 和适配器来吸收所有项目,包括孩子与其孩子“聊天”。

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


【解决方案1】:

最好的办法是创建多个自定义类:

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

...

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

然后你可以将整个东西反序列化为User

【讨论】:

  • 非常感谢@Sam-Stern!我理解并且我在我的应用程序中使用了这两个建议:来自你和来自@Alex-Mamo。
  • 嗨@sam-stern! UserChats 类呢?
【解决方案2】:

正如 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

【讨论】:

  • 嗨迪米特里!你有没有试过我上面的解决方案,它有效吗?
  • 嘿!非常感谢@Alex-Mamo!有效!看看我从 Log.d 中得到了什么:“2018-11-07 01:14:07.971 22395-22395/com.app.firebaseusertest D/MainActivity: Lat/Lng: 15.2512312, -12.1512321”。你的回答真的很完整!
  • 我的朋友@alex-mamo 节点聊天中的聊天列表呢?在 firebase 非规范化数据库中,这很常见:在其他节点下拥有其他节点的引用,例如:id = true。
  • 这听起来像是一个新的挑战,基本上应该被视为另一个无法在评论中回答或仅使用上述数据的问题。为了遵守本社区的规则,请使用MCVE 发布另一个新问题,以便我和其他用户可以帮助您。
  • 好的。谢谢我的朋友!
猜你喜欢
  • 1970-01-01
  • 2017-07-23
  • 1970-01-01
  • 1970-01-01
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
相关资源
最近更新 更多