【问题标题】:cloud firestore: set value without remove another valuecloud firestore:设置值而不删除另一个值
【发布时间】:2021-07-29 05:36:51
【问题描述】:

我使用模型类将数据设置到 Cloud Firestore。

public Users(String username,String age,String city,string avatar) {
        this.username = username;
        this.age=age;
        this.city=city
        this.avatar = avatar;
    }

我想先设置头像,再设置用户名、年龄和城市。但是当我设置头像值被删除时。 我想我可以尝试更新方法,但它需要一个地图并且我想使用模型,我不知道有其他方法或者我必须更新方法。 感谢您的帮助,祝大家有美好的一天!

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    假设您有一个如下所示的架构:

    Firestore- root
      |
      --- users (collection)
           |
           --- $uid (document)
                |
                --- username: "Lộc Trần Phước"
                |
                --- age: "20"
                |
                --- city: "Big City"
                |
                --- avatar: "https://..."
    

    我想先设置头像,下次我设置用户名、年龄和城市。

    如果你想先改变头像的值,请使用以下代码行:

    //Update avatar
    Map<String, Object> updateAvatar = new HashMap<>();
    updateAvatar.put("avatar", "otherURL");
    
    String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
    CollectionReference usersRef = rootRef.collection("users");
    DocumentReference uidRef = usersRef.document(uid);
    uidRef.update(updateAvatar).addOnCompleteListener(/* ... */);
    

    通过这种方式,您可以更新每个字段而不考虑其他字段。

    我想我可以尝试更新方法,但它需要一个地图,我想使用模型

    如果要更新头像字段,例如使用模型类,需要先阅读文档的内容。假设您已经有一个User 类,请使用以下代码行:

    uidRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(@NonNull Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document.exists()) {
                    User user = document.toObject(User.class);
                    user.avatar = "otherURL";
                    uidRef.set(user).addOnCompleteListener(/* ... */);
                } else {
                    Log.d(TAG, "No such document");
                }
            } else {
                Log.d(TAG, "get failed with ", task.getException());
            }
        }
    });
    

    【讨论】:

    • 它太详细了。非常感谢你,祝你有美好的一天!
    • 你说我想我可以尝试更新方法,但它需要一个地图我想使用模型所以你正在寻找使用模型类更新文档,并且您接受使用 Map 提供答案的答案?这真的可能会让未来的访客感到困惑。
    • 我只是觉得我应该灵活,如果使用地图是我应该做的关键。
    • 是的,如果您使用地图会更灵活。这就是为什么我在我的回答中添加了该解决方案。但是,您的问题是使用模型类
    • 我做到了。我可以问你几个问题,我使用方法 onSuccessListener 来放置数据,但我检索空数组,有人告诉我应该使用接口,因为这个方法是异步的。但我不知道怎么做,你能给我一份文件吗?非常感谢
    【解决方案2】:

    您可以使用 Map 仅更新一些值。 https://firebase.google.com/docs/firestore/manage-data/add-data#kotlin+ktx

    val city = hashMapOf(
            "name" to "Los Angeles",
            "state" to "CA",
            "country" to "USA"
    )
    
    db.collection("cities").document("LA")
            .set(city)
            .addOnSuccessListener { Log.d(TAG, "DocumentSnapshot successfully written!") }
            .addOnFailureListener { e -> Log.w(TAG, "Error writing document", e) }
    

    【讨论】:

    • 所以如果我创建一个包含我想要设置的值的构造函数,结果是否相同?
    • 你的意思是单独的构造函数吗?我不认为它会起作用,因为在这种情况下应该设置默认值,所以你需要使用 hashMap :)
    • 太伤心了。但非常感谢您的帮助!
    • @LộcTrầnPhước 不是必须仅使用地图。您也可以使用模型类,如下面的回答中所述。
    猜你喜欢
    • 1970-01-01
    • 2021-07-23
    • 2018-03-30
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2020-02-25
    相关资源
    最近更新 更多