Str*_*rmn 3 dart firebase firebase-realtime-database flutter
我正在尝试获取已从数据库返回的孩子的密钥。在下面的示例中,我选择了用户 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);
});
Run Code Online (Sandbox Code Playgroud)
两个问题:
要对每个子节点的特定属性进行排序/过滤,您需要使用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}');
});
});
Run Code Online (Sandbox Code Playgroud)
您也可以使用.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);
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4498 次 |
| 最近记录: |