【问题标题】:Firestore: Create a Subdocument of ArrayList inside a DocumentFirestore:在文档中创建 ArrayList 的子文档
【发布时间】:2018-04-15 10:37:13
【问题描述】:

我有一个名为 Routine 的类,它有属性名称和练习。 RoutineExercises 类型的 ArrayList 中的练习。

当我将例程写入我的 Firestore 数据库时,它会正常工作,并添加一个包含名称的文档和一个用于练习的数组,其中包含我的 ArrayList 中的所有对象。

但是我认为将练习与名称存储在同一个文档中可能不是一个好主意,因为我有时不需要这些练习。因此,我想在我的 Routine Document 中创建另一个 Collection“RoutineExercises”,其中包含 RoutineExercises 的 ArrayList。这就是我的代码的样子:

fm.getColRefUserRoutines().add(routine).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
    @Override
    public void onSuccess(DocumentReference documentReference) {
        documentReference.collection("RoutineExercises").add(routine.getExcersises()).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
            @Override
            public void onSuccess(DocumentReference documentReference) {
                Log.d("Success", "!!");
            }
        });
    }
});

fm.getColRefUserRoutine()返回我的例程集合。

但我是个例外:

java.lang.IllegalArgumentException:无效数据。数据必须是 Map 或合适的 POJO 对象

【问题讨论】:

    标签: android google-cloud-firestore


    【解决方案1】:

    要使用 add(),您必须传递 Map 或 Object。如果要添加一个对象,你必须有一个空的构造函数和它的 atributehere 的所有 getter。

    每个自定义类都必须有一个不带参数的公共构造函数。此外,该类必须为每个属性包含一个公共 getter

    如果你想插入你的练习列表,你可以试试这个:

    HashMap<String, Exercise> exerciseMap = new HashMap<String, Exercise (); 
    for (Exercise exercise : exerciseList) {
       exerciseMap.put(exercse.getExerciseCode(), exercise);
    
    }
    

    基于this 的回答。

    【讨论】:

    • 但在这种情况下,我的数据库中没有数组。这样,当我检索我的对象时,我不会将它作为 ArrayList...
    • 正确。您将获得一个 Map,然后您可以通过与保存它时所做的相反的操作将其“转换”为 ArrayList。
    • 是的,但是不能将 ArrayList 作为数组保存在单独的对象中吗?当我发布我的例程对象时,我有一个带有数组的文档和一个带有名称的字符串。当我检索这个对象时,它已经从这个数组中填充了我的 ArrayList。现在我只想拆分这个对象,所以我的这个数组和我的 name 属性不在同一个 Document 中。
    【解决方案2】:

    根据我从您的问题中了解到的情况,您希望在您的日常文档中创建一个练习子集。 以下代码会将所有练习添加到您的常规文档内的 RoutineExercises 集合中。 据我所知,您不能直接将 ArrayList 保存为子集合。

    fm.getColRefUserRoutines().add(routine).addOnSuccessListener(new 
    OnSuccessListener<DocumentReference>() {
            @Override
            public void onSuccess(DocumentReference documentReference) {
                for (Exercise exercise: routine.getExcersises()) {
                documentReference.collection("RoutineExercises").add(exercise).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                    @Override
                    public void onSuccess(DocumentReference documentReference) {
                        Log.d("Success", "!!");
                    }
                });
            }
    
        }
    });
    

    【讨论】:

    • 这不是我的想法,但似乎也有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 2020-10-07
    • 1970-01-01
    相关资源
    最近更新 更多