注册时尝试向 Firebase 用户添加新的数据字段,但 FirebaseUser.class 文件中没有更新 X 方法

Posted

技术标签:

【中文标题】注册时尝试向 Firebase 用户添加新的数据字段,但 FirebaseUser.class 文件中没有更新 X 方法【英文标题】:Tried to add a new field of data to Firebase user when registering, but no update X method in FirebaseUser.class file 【发布时间】:2021-11-08 16:40:03 【问题描述】:

我使用的是实时数据库,所以用户存储在数据库中。我正在尝试为 FirebaseUser 对象实现一个“currentLocation”字段,以便最终可以为附近用户的每个用户创建一个列表。我已经在使用 HashMap 来输入数据,所以我只添加了 hashmap.put('currentLocation', '');创建一个空的当前位置字段,以后可以更新。

不幸的是,由于 FirebaseUser.class 中没有 updateCurrentLocation() 方法,我找不到设置/更新 currentLocation 字段的方法。如何将此方法添加到此只读文件?这甚至是最好的方法吗?

代码:

    //Dashboard.java
usedLocationClient.getLastLocation()
                .addOnSuccessListener(this, new OnSuccessListener<Location>() 
                    @Override
                    public void onSuccess(Location location) 
                        // Got last known location. In some rare situations this can be null.
                        if (location != null) 
                            // Logic to handle location object
                            //get current user
                            final FirebaseUser fUser = FirebaseAuth.getInstance().getCurrentUser();

                            //Updates the firebase db user with their current location.
                            fUser.updateCurrentLocation(location);
                            
                            //This method is not in the firebaseuser.class file but needs to be!
                            //fUser.updateCurrentLocation(location);
                        
                    
                );
                
    //RegisterActivity.java

mAuth.createUserWithEmailAndPassword(email, password)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() 
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) 
                        if (task.isSuccessful()) 
                            // Sign in success, dismiss dialog and start register activity
                            progressDialog.dismiss();

                            FirebaseUser user = mAuth.getCurrentUser();
                            //Get user email and uid from auth
                            String email = user.getEmail();
                            String uid = user.getUid();
                            //When user is registered store user info in firebase realtime database too
                            //using HashMap
                            HashMap<Object, String> hashMap = new HashMap<>();
                            //put info in hasmap
                            hashMap.put("email", email);
                            hashMap.put("uid", uid);
                            hashMap.put("name", ""); //will add later (e.g. edit profile)
      
                            hashMap.put("currentLocation", "");
                            hashMap.put("onlineStatus", "online"); //will add later (e.g. edit profile)
                            hashMap.put("typingTo", "noOne"); //will add later (e.g. edit profile)
                            hashMap.put("phone", ""); //will add later (e.g. edit profile)
                            hashMap.put("image", ""); //will add later (e.g. edit profile)
                            hashMap.put("cover", ""); //will add later (e.g. edit profile)

                            //firebase database instance
                            FirebaseDatabase database = FirebaseDatabase.getInstance();
                            //path to store user data named "Users"
                            DatabaseReference reference = database.getReference("Users");
                            //put data within hashmap in database
                            reference.child(uid).setValue(hashMap);

                            Toast.makeText(RegisterActivity.this, "Registered...\n"+user.getEmail(), Toast.LENGTH_SHORT).show();
                            startActivity(new Intent(RegisterActivity.this, DashboardActivity.class));
                            finish();
                        
//FirebaseUser.class Bytecode

@NonNull
public Task<Void> updateEmail(@NonNull String email) 
    Preconditions.checkNotEmpty(email);
    return FirebaseAuth.getInstance(this.zza()).zzn(this, email);


@NonNull
public Task<Void> updatePassword(@NonNull String password) 
    Preconditions.checkNotEmpty(password);
    return FirebaseAuth.getInstance(this.zza()).zzo(this, password);


@NonNull
public Task<Void> updatePhoneNumber(@NonNull PhoneAuthCredential credential) 
    return FirebaseAuth.getInstance(this.zza()).zzp(this, credential);


@NonNull
public Task<Void> updateProfile(@NonNull UserProfileChangeRequest request) 
    Preconditions.checkNotNull(request);
    return FirebaseAuth.getInstance(this.zza()).zzq(this, request);

【问题讨论】:

【参考方案1】:

FirebaseUser 类,只有几个与身份验证相关的字段。如果您需要有关用户的更多详细信息,您应该创建一个 POJO 类来存储其他数据。

这些数据可以存储在Cloud Firestore 或Realtime Database 中,以便以后使用。

另请注意,实时数据库不存储空值。 Firestore 可以。

【讨论】:

感谢您的回复,但我已经在测试时将这种方法用于不同的值并且它有效。所以我添加了另一个字段并将其设置为空,它以空值出现在实时数据库中。然后我添加了一个表单来更新值,它工作正常。尽管它仍然没有 FirebaseUser.update() 方法。那么我需要查找什么才能使用 POJO 执行此操作?谢谢。 我认为repo 可以帮助您了解这个想法。如果您需要更新 FirebaseUser 对象,请检查此answer。【参考方案2】:

要更新当前用户的位置,你可以这样做:

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference reference = database.getReference("Users");
reference.child(uid).child("currentLocation").setValue("the location");

既然你提到想找到附近的用户,我建议你去看看:Query for nearby locations 和https://github.com/firebase/geofire-android/

【讨论】:

以上是关于注册时尝试向 Firebase 用户添加新的数据字段,但 FirebaseUser.class 文件中没有更新 X 方法的主要内容,如果未能解决你的问题,请参考以下文章

无法注册新的 FireBase 用户

注册时如何将用户名添加到 Firebase 数据库?

使用 Firebase/Batch 向特定登录用户推送通知

将 Firebase FCM 添加到 reactjs 应用程序

我应该自己保存firebase令牌还是在注册远程通知时自动完成?

为啥注册用户未在 Firebase 中进行身份验证?为啥用户不能将产品添加到数据库 Firebase?