【发布时间】:2021-10-22 18:51:23
【问题描述】:
我有一个集合users,每个用户都有自己的文档。现在我想创建一个子集合来存储与特定用户相关的更多数据。
这是目前为止的代码:
class DatabaseService {
Future isUserRegistered(String uid) async{
return await FirebaseFirestore.instance.collection('users')
.where('uid', isEqualTo: uid)
.get();
}
Future registerNewUser(email, password, uid) async{
return await FirebaseFirestore.instance.collection('users')
.doc(uid).set(
{
"email": email,
"password": password,
"uid": uid,
"token": -1,
"userGoal": false,
"userGender": false,
},
);
}
我创建了一个保存函数,但不是将数据存储在具有当前 uid 的文档中的子集合中,而是创建了一个名为“uid”的新文档。如何解决?
Future saveInSubcollectionToRemote() async{
Map<String, dynamic> data = UserManager.userWeights;
return await FirebaseFirestore.instance.collection('users')
.doc('uid')
.collection('weights')
.doc(data['userWeight'])
.set(data);
}
class UserManager {
static Map<String, dynamic> userWeights = {'weights': []};
}
编辑 这是我的 google 身份验证,在这里我得到一个 id,但我想要的是 uid 而不是这个 id
///Authentication
void signInGoogle(context) {
DatabaseService handler = new DatabaseService();
_googleSignIn
.signIn()
.then((userdata) => {
print(userdata.toString()),
handler
.isUserRegistered(userdata.id.toString())
.then((value) => {
if (value.docs.length == 0)
{
print("Not registered"),
registerUserToApp(
context, userdata.email.toString(), "password", userdata.id.toString())
}
else
{
print(value.docs[0].data().toString()),
UserManager.userdata = value.docs[0].data(),
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(
builder: (context) {
return NavBar();
},
),
(route) => false,
),
}
})
.catchError((e) => {
showAlertDialog(
context, "Error", ""),
})
})
.catchError(
(e) => {showAlertDialog(context, "Error", "")});
}
void registerUserToApp(context, email, password, uid) {
DatabaseService handler = new DatabaseService();
try {
handler.registerNewUser(email, password, uid).then((value) => {
showAlertDialog(context, "Congratulations!",
"You registered to the app"),
});
} catch (error) {
print(error.toString());
showAlertDialog(context, "Error", "");
}
}
}
【问题讨论】:
-
听起来您实际上没有用户的 UID。如果你这样做了,你只需把它放在字符串 'uid' 的位置。 Firestore 不会为您管理 UID - 您可以从其他地方获取它们,例如 Firebase 身份验证。
-
我是用google登录的,是不是和其他认证方式类似?以及如何获取uid?抱歉,我是 Firestore 的新手
-
底线是,无论您的用户标识符是什么,您都必须向 Firestore 提供数据。 Firestore 不知道,也无法知道。它没有“用户”。它只是一个数据库,您必须提供要存储的值。如果您使用 Firebase 身份验证,则可以在安全规则中为用户分配权限,仅此而已。
标签: flutter dart google-cloud-firestore