【问题标题】:Android Firebase update only some fieldsAndroid Firebase 仅更新部分字段
【发布时间】:2017-01-17 02:42:42
【问题描述】:

我正在开发一个 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); 时,我所有的旧数据都会更新,而我的新孩子(我在应用期间创建的)会丢失。

【问题讨论】:

  • 嗨。请发布您的数据库结构。
  • 嗨,我在运行命令 myRef.updateChildren(childUpdates); 后上传了一张图片

标签: android firebase firebase-realtime-database


【解决方案1】:

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

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

【讨论】:

  • 嗨,谢谢,我正在这样做,没关系。但是,我尝试将 user 类用于“干净”模式..
  • @rodrigo 您需要将所有需要的数据添加到您的用户类中。
  • @AldiRenaldiGunawan- 这太完美了!但再次需要你的帮助。这是完美的,因为从 8 个字段中我只需要更新 1 个字段,这确实节省了执行时间。但是现在我只需要更新 8 个字段中的 3 个字段吗?有什么技巧可以用一个只包含这 3 个字段的较小对象来更新它??
  • @user3833732 请在下面使用地图查看我的答案
【解决方案2】:

您用来执行更新的参考是路径FB_REFERENCE_USER - 这似乎是包含用户的路径。

updateChildren 仅更新直接子代,并替换那些下的值。因此,更新正在为用户替换整个孩子,而让其他用户的孩子保持不变。这是预期的行为。

您需要使用该特定用户的 ref 执行更新 - 以便该用户的未更新属性保持不变。

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

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

updateChildren 的行为在文档中描述为here

【讨论】:

  • 看起来这个部分更新需要创建一个新的 pojo 类,因为原来的 pojo 类将接受所有项目。是不是创建对象昂贵的内存明智。应该只是不使用地图来更新孩子吗?喜欢我下面的回答
【解决方案3】:

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

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

例如:

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

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

【讨论】:

    【解决方案4】:

    您可以使用地图来做同样的事情...

        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());
    
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-20
      • 1970-01-01
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      • 2021-07-02
      • 2017-11-30
      相关资源
      最近更新 更多