【问题标题】:How do I get the key of a value in FirebaseDatabase using Flutter / Dart?如何使用 Flutter/Dart 在 FirebaseDatabase 中获取值的键?
【发布时间】:2020-09-22 18:56:53
【问题描述】:

我正在尝试获取已从数据库返回的孩子的密钥。在下面的示例中,我将用户选为 Carlos Sainz,我正在尝试获取“csainz”,但是下面的代码返回“email”。

    DatabaseReference keyRef = FirebaseDatabase.instance.reference();
    await keyRef.child('users')
        .child('email')
        .equalTo(userList[0].email) // userList[0].email returns Carlos' email
        .once()
        .then((DataSnapshot dataSnapshot) {
          String newKey = dataSnapshot.key;
          print(newKey);
    });

这是我的数据库的设置方式:

【问题讨论】:

  • 所以在javascript中,我们可以使用sanapshot.ref.key,但我猜Flutter中没有(不确定)。所以你可以在 Github 问题中提出这个问题。

标签: firebase flutter dart firebase-realtime-database


【解决方案1】:

两个问题:

  1. 要对每个子节点的特定属性进行排序/过滤,您需要使用orderByChild(...) 而不仅仅是child(...)。现在您的代码显示为/users/email,它不存在。

  2. 当您对 Firebase 数据库执行查询时,可能会有多个结果。所以快照包含这些结果的列表。即使只有一个结果,快照也会包含一个结果列表。

    您的代码不处理该列表,而是打印执行查询的位置的键:users

所以修复这两个看起来像这样:

DatabaseReference keyRef = FirebaseDatabase.instance.reference();
await keyRef.child('users')
    .orderByChild('email')
    .equalTo(userList[0].email)
    .onChildAdded.listen((Event event) {
      print('${event.snapshot.key}');
    }, onError: (Object o) {
      final DatabaseError error = o;
      print('Error: ${error.code} ${error.message}');
    });
});

可以也使用.once().then(...),但随后会将dataSnapshot.value 转换为地图,并显示该地图中的键。不检查,但应该是这样的:

DatabaseReference keyRef = FirebaseDatabase.instance.reference();
await keyRef.child('users')
    .orderByChild('email')
    .equalTo(userList[0].email)
    .once()
    .then((DataSnapshot dataSnapshot) {
      String newKey = dataSnapshot.value.keys[0];
      print(newKey);
    });

【讨论】:

  • 这太棒了。谢谢!!
猜你喜欢
  • 2020-10-03
  • 2021-07-16
  • 2018-08-25
  • 2019-10-02
  • 2019-02-02
  • 2019-02-23
  • 2020-07-06
  • 2019-09-04
  • 2020-09-25
相关资源
最近更新 更多