Anu*_*mar 6 java android firebase firebase-authentication firebase-realtime-database
我有一个已经使用 Firebase 进行电子邮件和密码身份验证的 Android 应用程序。为了用户的方便,我现在还在项目中添加了 Google Sign-In。
问题是,当我使用电子邮件登录时,应用程序会根据用户的 uid(唯一用户 ID - 通过 Firebase 身份验证获取)在密钥下的实时数据库上创建一些数据。该数据通常在用户注册时创建。但是,当用户使用谷歌登录功能时,他们会通过谷歌播放服务托管的另一个活动进行身份验证。我无法添加此数据。
所以,问题出现了,我现在应该怎么做来检查用户是否刚刚使用 Google 帐户登录。此外,如果用户第一次登录 google,它将在实时数据库中创建新数据,否则它将检索数据。
请帮助我,因为我被卡住了。
小智 5
在 javascript 中,以下方法firebase.auth().signInWithCredential返回firebase.auth.UserCredential具有属性additionalUserInfo.
additionalUserInfo有一个名为 的布尔属性isNewUser。
您可以进行简单的检查isNewUser来检查用户是否是首次登录。
耶!我找到了一种无论数据是否已存在于数据库中都有效的方法。它按我的预期工作,如果我从谷歌/电子邮件创建一个新用户,我会将他们的名字保存在实时数据库中,但从同一帐户登录,早些时候也会导致在同一位置重写新数据(名称)大量使用数据带宽。我通过这个解决了。它只是检查数据存在或不存在的位置,然后进一步前进。
final User newUser = new User();
newUser.email = user.getEmail();
newUser.name = user.getDisplayName();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
rootRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.hasChild("user/" + user.getUid())) {
//User Exists , No Need To add new data.
//Get previous data from firebase. Take previous data as soon as possible..
return;
} else {
FirebaseDatabase.getInstance().getReference().child("user/" + user.getUid()).setValue(newUser);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Run Code Online (Sandbox Code Playgroud)
我有件事要告诉你们,User 是一个带有 POJO 的自定义类,用于将数据放入 firebase 数据库中。如果这也适合你,请回复我。
编辑-Firestore
newUser.email = user.getEmail();
newUser.name = user.getDisplayName();
DocumentReference docRef =
db.collection("users").document(user.getUid());
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull
Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
//User Exists , No Need To add new data.
//Get previous data from firebase. Take previous data as soon as possible..
} else {
Log.d(TAG, "No such document");
//Set new data here
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});```
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5107 次 |
| 最近记录: |