【问题标题】:The User UID is not the same with document id in Firestore Android用户 UID 与 Firestore Android 中的文档 ID 不同
【发布时间】:2021-04-21 23:03:05
【问题描述】:

我创建了一个向 Firestore 数据库添加新用户的函数:

public void addNewUser(String email, String username, String profile_photo){
        FirebaseFirestore db = FirebaseFirestore.getInstance(); // this is instantiated here, just to show you 
        User user = new User(userID, (long) 1, email, StringManipulation.condenseUsername(username), username, profile_photo);

        db.collection("Users").add(user)
                .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                    @Override
                    public void onSuccess(DocumentReference documentReference) {
                        Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId());
                    }
                })
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Log.w(TAG, "Error adding document", e);
                    }
                });
    }

还有一个从数据库中获取数据的函数,等待所有字段出现在应用程序中。

public UserSettings RetrieveUserSettings(){
        Log.d(TAG, "getUserAccountSettings: retrieving user account settings from firebase");

        User settings = new User();
        DocumentReference userRef;
        FirebaseAuth firebaseAuth=FirebaseAuth.getInstance();
        

                try {
                    userRef = db.collection("Users")
                                .document(firebaseAuth.getCurrentUser().getUid());

                    userRef.get()
                            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                                @Override
                                public void onSuccess(DocumentSnapshot documentSnapshot) {
                                    if(documentSnapshot.exists())
                                    {
                                        settings.setDisplay_name(documentSnapshot.getString("display_name"));
                                        settings.setUsername(documentSnapshot.getString("username"));
                                        settings.setProfile_photo(documentSnapshot.getString("profile_photo"));
                                        settings.setEmail(documentSnapshot.getString("email"));
                                        settings.setPhone_number(documentSnapshot.getLong("phone_number"));
                                        settings.setUser_id(documentSnapshot.getString("user_id"));
                                    }
                                    else{
                                        Log.d(TAG, "doc not fount in getUserSettinghs ");
                                    }
                                }
                            })
                            .addOnFailureListener(new OnFailureListener() {
                                @Override
                                public void onFailure(@NonNull Exception e) {
                                    Log.d(TAG, "onFailure: failed to fetch data");
                                }
                            });

                } catch (NullPointerException e) {
                    Log.d(TAG, "getUserAccountSettings: NULLPointerException: " + e.getMessage());
                }
                Log.e(TAG, "getUserAccountSettings: retrieved user_account_settings information: " + settings.toString());

        return new UserSettings(settings);
    }

当我进行身份验证时,这是生成的用户 UID:E5bBL0D9lCSKy5a0YdUJjuMVuUT2,但是当我调用 addNewUser 函数时,我的 Firestore 数据库如下所示: ,所以很明显认证时生成的User UID和document id不一样,即: XWwnRBklieJXSxokQuNe.你知道为什么会这样吗?

【问题讨论】:

  • 您永远不会在此处指定文档路径。调用 CollectionRererence.add() 将为您生成一个新的文档 ID。因此,您应该“导航”到所需的特定文档路径。
  • 你能建议我怎么做吗?因为我写了add(user),所以user包含了所有的字段,甚至user-id
  • 当然,您可以致电CollectionReference.document(id).set(user)add 方法只是相同的快捷方式,但具有随机文档 ID。请记住,文档 ID 和字段之间存在很大差异。想象一个以CODEnoob为第一行的文本文件,文件名也不一定是CODEnoob
  • 但这将如何从 firestore 检索我的所有数据?对我来说,这似乎是我一直在使用的 addNewUser 函数
  • 您从未说过您在检索数据时遇到问题?我以为您的问题是使用 addNewUsermethod 生成的 ID?

标签: java android firebase google-cloud-firestore firebase-authentication


【解决方案1】:

正如@HenryTwist 在他的评论中提到的,在使用以下代码行时:

db.collection("Users").add(user).addOnSuccessListener(/* ... /*);

您正在使用随机 ID 将新的“用户”对象添加到“用户”集合中。上面这行代码的作用与以下相同:

db.collection("Users").document().set(user).addOnSuccessListener(/* ... /*);

当您在不传递任何参数的情况下调用 CollectionReference 的 add() 方法或 CollectionReference 的 document() 方法时,Firestore 使用的内置生成器将始终在每次其中一个方法被调用时生成一个随机 ID调用。

正如我从以下代码行中看到的:

userRef = db.collection("Users").document(firebaseAuth.getCurrentUser().getUid());

你已经实现了Firebase Authentication,这很好。话虽如此,当您想向数据库中添加新的“用户”对象时,请使用来自身份验证过程的 UID,如下所示:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
db.collection("Users").document(uid).set(user).addOnSuccessListener(/* ... /*);

这样,文档的 ID 将匹配数据库中“user_id”属性的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    • 2018-10-04
    • 2020-11-16
    • 2019-09-30
    相关资源
    最近更新 更多