【问题标题】:How can I update arrayList inside document?如何更新文档内的arrayList?
【发布时间】:2019-07-13 19:56:04
【问题描述】:

当我想更新用户文档中的 recipIds 数组列表时,数组列表会被擦除并设置新值。

我尝试获取旧集合,然后为其添加新值并进行更新,但这似乎有点矫枉过正。

public void saveRecipeIds(User user) {
    String currentUserId = mAuth.getCurrentUser().getUid();

    Map<String, Object> userMap = new HashMap<>();
    userMap.put("recipeIds", user.getRecipesIds());

    db.collection("users").document(currentUserId).update(userMap);
}

我想用新值更新我的数组列表而不擦除旧列表数据。

这是它在 Firestore 中的外观:

https://imgur.com/a/LUnYxsa

已编辑:

public void saveRecipeIds(User user) {
    String currentUserId = mAuth.getCurrentUser().getUid();

    Map<String, Object> userMap = new HashMap<>();
    userMap.put("recipeIds", user.getRecipesIds());

    db.collection("users").document(currentUserId)
        .update("recipeIds", FieldValue.arrayUnion(userMap));
}

https://imgur.com/a/yTywInK

编辑

public void saveRecipeIds(User user) {
    String currentUserId = mAuth.getCurrentUser().getUid();

//  Map<String, Object> userMap = new HashMap<>();
//  userMap.put("recipeIds", user.getRecipesIds());

    db.collection("users").document(currentUserId)
        .update("recipeIds", FieldValue.arrayUnion(user.getRecipesIds()));
}

错误:

java.lang.IllegalArgumentException: Invalid data. Nested arrays are not supported
        at com.google.firebase.firestore.core.UserData$ParseContext.createError(com.google.firebase:firebase-firestore@@18.2.0:293)
        at com.google.firebase.firestore.UserDataConverter.parseData(com.google.firebase:firebase-firestore@@18.2.0:261)
        at com.google.firebase.firestore.UserDataConverter.convertAndParseFieldData(com.google.firebase:firebase-firestore@@18.2.0:202)
        at com.google.firebase.firestore.UserDataConverter.parseArrayTransformElements(com.google.firebase:firebase-firestore@@18.2.0:440)
        at com.google.firebase.firestore.UserDataConverter.parseSentinelFieldValue(com.google.firebase:firebase-firestore@@18.2.0:346)
        at com.google.firebase.firestore.UserDataConverter.parseData(com.google.firebase:firebase-firestore@@18.2.0:248)
        at com.google.firebase.firestore.UserDataConverter.convertAndParseFieldData(com.google.firebase:firebase-firestore@@18.2.0:202)
        at com.google.firebase.firestore.UserDataConverter.parseUpdateData(com.google.firebase:firebase-firestore@@18.2.0:176)
        at com.google.firebase.firestore.DocumentReference.update(com.google.firebase:firebase-firestore@@18.2.0:213)
        at com.example.cookingapp.Repository.UserRepository.saveRecipeIds(UserRepository.java:143)
        at com.example.cookingapp.ViewModels.UserViewModel.saveRecipeIds(UserViewModel.java:57)
        at com.example.cookingapp.Views.Fragments.Home.FinishRecipeFragment$1.onClick(FinishRecipeFragment.java:111)
        at android.view.View.performClick(View.java:6199)
        at android.widget.TextView.performClick(TextView.java:11090)
        at android.view.View$PerformClick.run(View.java:23647)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6682)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1520)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1410)

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    要更新recipeIds 数组,您应该使用FieldValue.arrayUnion,如以下代码行:

    db.collection("users").document(currentUserId)
        .update("recipeIds", FieldValue.arrayUnion("newRecipeId"));
    

    编辑:

    为了能够更新数组,例如通过添加新元素,您需要将字符串(id 本身)传递给arrayUnion() 方法。您不能传递一个列表或字符串数​​组。你没有办法做到这一点。您可以从数组中逐个添加/删除元素。

    如果你想用另一个数组更新数组,你应该首先从数据库中获取文档,在客户端进行必要的更改,然后将它写回数据库。

    【讨论】:

    • 嗨贾斯蒂纳斯!你有没有试过我上面的解决方案,它有效吗?
    • 你好,是的,我试过了,但现在它返回了我在其他数组中的数组。如何预防?
    • 您使用的是我提供给您的相同代码吗?请将您正在使用的确切代码添加到您的问题中。
    • 这是正常行为,因为您将地图作为第一个参数传递。要解决传递文字字符串而不是地图的问题,.see arrayUnion("newRecipeId") ?你的情况是.arrayUnion(user.getRecipesIds())
    • 我现在收到此错误:java.lang.IllegalArgumentException:无效数据。不支持嵌套数组
    猜你喜欢
    • 1970-01-01
    • 2011-06-12
    • 1970-01-01
    • 2014-05-14
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 2018-01-31
    相关资源
    最近更新 更多