我正在尝试在创建用户后直接将用户数据保存到Firebase实时数据库。但是问题不是保存,而是用户ID。我保存还保存从CurrentUser获得的用户ID。然后我检查了实时数据库,发现存储的ID来自最近创建的最后一个用户。我通过获取当前用户电子邮件在编辑器中对其进行检查,它显示了最后一个用户电子邮件,而不是当前正在创建的当前用户。有人可以帮助我获取当前用户ID而不是最后一个用户ID。 你们可以从链接中看到图像。 What ID should be The last user ID showing up instead你们看到ID不匹配。我确实尝试过重做该项目,并查看Firebase本身的视频。我真的无所适从,现在被困了3天。
public void SaveNewUserInCode(string userId, string Name, string Email) {
var currentUser = FirebaseAuth.DefaultInstance.CurrentUser;
string userNameId;
if (currentUser != null)
{
userNameId = currentUser.Email;
user = new User(userId, Name, Email);
string Json = JsonUtility.ToJson(user);
reference.Child("Users").Child(currentUser.UserId).SetRawJsonValueAsync(Json);
Data.text = userNameId;
}
}
答案 0 :(得分:1)
查看调用SaveNewUserInCode
的代码会很有帮助。
我发现您发布的代码存在一些潜在危险:
第一个是任何调用(Auth.SignOut
除外)都是异步的。如果您要在userId
之后立即缓存Auth.SignInWithEmailAndPasswordAsync
,则很可能使先前的用户仍在Auth.CurrentUser
中(直到相关任务完成)。如果您认为这是问题所在,请参见my related post,以了解在Unity中等待任务的所有方式。
第二个,尤其是在Email有时为空的情况下,您可能会在每次应用启动时自动调用Auth.SignInAnonymouslyAsync
(也许是旧逻辑,我通常从匿名用户启动我的原型,然后在需要时添加真实帐户做一些用户测试)。即使您之前曾匿名登录,该操作也会始终覆盖当前用户。在调用任何Auth.CurrentUser
方法之前,应始终检查Auth.SignIn
,但绝对要确保没有混乱的Auth.SignInAnonymouslyAsync
。
如果问题是线程问题,我相信以下逻辑将解决您的问题:
var auth = FirebaseAuth.DefaultInstance;
auth.SignInWithEmailAndPasswordAsync(email, password).ContinueWithOnMainThread(task => {
// omitted : any error handling. Check task's state
var user = task.Result;
SaveNewUserInCode(user.UserId, user.DisplayName /* or however you get Name */, user.Email);
});