无法通过Firebase userId更新用户表的技术问题求助
Got it, let's walk through how to update those new fields (country and occupation) to your Firebase user table using the user's UID. Here's a step-by-step breakdown with code that fits your setup:
Step 1: Get the Current Logged-In User's UID
First, you need to retrieve the UID of the user who's currently logged in—this is your key to target the correct user record in the database:
FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if (currentUser == null) { // Handle case where user isn't logged in (e.g., redirect to login screen) Toast.makeText(this, "User not logged in!", Toast.LENGTH_SHORT).show(); return; } String userId = currentUser.getUid();
Step 2: Set Up Your Database Reference
Point to the specific user node in your Firebase Realtime Database. Assuming your users are stored under a users node (adjust this if your structure is different):
FirebaseDatabase database = FirebaseDatabase.getInstance(); DatabaseReference userProfileRef = database.getReference("users").child(userId);
Step 3: Update the New Fields (Two Approaches)
Approach 1: Update Only the New Fields (Recommended)
This method uses updateChildren() to modify just the country and occupation fields without overwriting existing user data (like firstName, lastName, etc.). It's more efficient and safer:
// Get input values from your EditTexts String country = yourCountryEditText.getText().toString().trim(); String occupation = yourOccupationEditText.getText().toString().trim(); // Validate input (optional but recommended) if (country.isEmpty() || occupation.isEmpty()) { Toast.makeText(this, "Please fill all fields!", Toast.LENGTH_SHORT).show(); return; } // Create a map of fields to update Map<String, Object> profileUpdates = new HashMap<>(); profileUpdates.put("country", country); profileUpdates.put("occupation", occupation); // Execute the update userProfileRef.updateChildren(profileUpdates) .addOnSuccessListener(v -> { // Success handling Toast.makeText(this, "Profile updated successfully!", Toast.LENGTH_SHORT).show(); // Optional: Navigate back or refresh the page }) .addOnFailureListener(e -> { // Error handling Toast.makeText(this, "Update failed: " + e.getMessage(), Toast.LENGTH_SHORT).show(); });
Approach 2: Use Your UserProfileBean Class
If you prefer to work with your existing UserProfileBean model, you can first fetch the current user data, update the new fields, then save the entire object back:
// Fetch existing user data first userProfileRef.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { UserProfileBean userProfile = snapshot.getValue(UserProfileBean.class); if (userProfile != null) { // Update the new fields userProfile.setCountry(yourCountryEditText.getText().toString().trim()); userProfile.setOccupation(yourOccupationEditText.getText().toString().trim()); // Save the updated object back to the database userProfileRef.setValue(userProfile) .addOnSuccessListener(v -> { Toast.makeText(MainActivity.this, "Profile updated!", Toast.LENGTH_SHORT).show(); }) .addOnFailureListener(e -> { Toast.makeText(MainActivity.this, "Error: " + e.getMessage(), Toast.LENGTH_SHORT).show(); }); } } @Override public void onCancelled(@NonNull DatabaseError error) { Toast.makeText(MainActivity.this, "Failed to load profile: " + error.getMessage(), Toast.LENGTH_SHORT).show(); } });
Important Notes
- Make sure your
UserProfileBeanclass has getter/setter methods forcountryandoccupation, and that the field names match exactly with the keys in your Firebase database (use@PropertyNameannotation if you need to map different names). - Always handle the case where the user isn't logged in (as shown in Step 1) to avoid null pointer exceptions.
- Adding input validation (like checking for empty fields) improves the user experience and prevents bad data from being saved.
内容的提问来源于stack exchange,提问作者Nuwan Withanage

