firebase - 如何使用 Flutter/Dart 在 FirebaseDatabase 中获取值的键?
问题描述
我正在尝试获取已从数据库返回的孩子的密钥。在下面的示例中,我将用户选为 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);
});
解决方案
两个问题:
要对每个子节点的特定属性进行排序/过滤,您需要使用
orderByChild(...)
而不仅仅是child(...)
. 现在你的代码读取/users/email
,它不存在。当您对 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);
});
推荐阅读
- javascript - 在 Aframe 中的小地图上反映用户在运行时的位置和旋转
- rally - Rally HTML 应用程序总是强制浏览器滚动条 - 如何避免这种情况?
- c# - 无法在搜索中显示 gridview 数据
- r - 从列表中删除与 R 中数据框中的列匹配的数据框
- java - 在硒中使用字符串外部测试
- javascript - react-native 中的垂直幻灯片视图
- c - 中间人攻击 SLL_Accept 失败,抛出错误:140760FC:SSL 例程:SSL23_GET_CLIENT_HELLO:未知协议:
- python-3.x - 如何在多行的 .csv 文件中选择特定部分?(Python3)
- javascript - 带有 json 和 jsPDF 的发票 PDF 或账单 PDF
- c# - Dictionary 通过 ICollection 接口继承,但不实现所有成员