Android Firebase仅更新某些字段

时间:2017-01-17 02:42:43

标签: android firebase firebase-realtime-database

我正在开发一个Android应用程序,每当用户启动此应用程序时,它将生成一个新的注册表(如果不存在),在更新现有数据时,我的应用程序将在用户节点。

每次更新此节点时,所有其他信息都将丢失。

我的用户类

@IgnoreExtraProperties
public class User {

public String userID;
public String userName;
public String userMail;
public boolean active;

    public User() {}

    public User(String userID, String userName) {
        this.userID = userID;
        this.userName = userName;
    }

    public User(String userID, String userName, String userMail, boolean active) {
        this.userID = userID;
        this.userName = userName;
        this.userMail = userMail;
        this.active = active;

    }

    @Exclude
    public Map<String, Object> toMap() {
        HashMap<String, Object> result = new HashMap<>();
        result.put("user_id", userID);
        result.put("name", userName);
        result.put("email", userMail);
        result.put("active", active);

        return result;
   }

}

我的更新代码:

public class FireBaseUser {
    public static String FB_REFERENCE_USER = "user";

    public void updateUser(String userID, String userName, String userMail, boolean userActive) {
        // Write a message to the database
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        DatabaseReference myRef = database.getReference(FB_REFERENCE_USER);


        User user = new User(userID, userName, userMail, userActive);
        Map<String, Object> postValues = user.toMap();

        Map<String, Object> childUpdates = new HashMap<>();
        childUpdates.put(userID, postValues);

        myRef.updateChildren(childUpdates);

    }
}

当我致电myRef.updateChildren(childUpdates);时,我的所有旧数据都会更新,而我的新孩子(我在应用中创建的)也会丢失。

enter image description here

4 个答案:

答案 0 :(得分:10)

您正在执行更新的引用是路径FB_REFERENCE_USER - 它似乎是包含用户的路径。

updateChildren仅更新直接子项,其中的值将被替换。因此,更新正在为用户替换整个子节点,并且不会触及其他用户的子节点。这是预期的行为。

您需要使用针对该特定用户的参考执行更新 - 以便保持未更新的该用户的属性不受影响。

也就是说,你需要做这样的事情:

User user = new User(userID, userName, userMail, userActive);
Map<String, Object> postValues = user.toMap();
myRef.child(userID).updateChildren(postValues);

文档中描述了updateChildren的行为here

答案 1 :(得分:9)

如果您只想更新某些字段,请尝试使用

myRef.child(userID).child("which field do you want to update").setValue(ValueVariable);

答案 2 :(得分:1)

是的,您可以在不丢失其他现有数据的情况下更新单个节点。

您需要创建pojo并在现有节点中设置要更新的值,并将pojo对象发送到setValue(pojo)方法。

例如:

User updatedUser=new User();
updatedUser.setName("Rishabh");
updatedUser.SetEmail("rishabh9393@gmail.com");
myref.setValue(updatedUser);

PS:myref是您要在其中更新数据的user id节点的引用。

答案 3 :(得分:0)

您可以使用地图执行相同的操作...

    String active = "true";
    String email = "email@email.com";
    String name = "your name";
    String user_id = "user_id";

    // HashMap For Updating Data
    HashMap<String, Object> updateFbDb = new HashMap<>();
    updateFbDb.put("active", active);
    updateFbDb.put("email", email);
    updateFbDb.put("name", name);
    updateFbDb.put("user_id", user_id);

    fbDbRefRoot.child("user").child(currentUserId).updateChildren(updateFbDb).addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void aVoid) {

            // Done

        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {

            Log.d(TAG, "fbSetValueFailure: " + e.getMessage());

        }
    });