Firestore:在Document中创建ArrayList的子文档

时间:2018-04-15 10:37:14

标签: android google-cloud-firestore

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

当我将我的Routine编写到我的Firestore数据库时,它的工作方式应该是这样,并为我的ArrayList中的所有对象添加一个带有名称和数组的文档。

但是我认为将练习存放在与名称相同的文档中并不是一个好主意,因为我有时候不需要这些练习。所以我想创建另一个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对象

2 个答案:

答案 0 :(得分:2)

要使用add(),您必须传递Map或Object。如果要添加对象,则必须具有空构造函数以及其属性here的所有getter。

  

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

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

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

}

基于this回答。

答案 1 :(得分:0)

根据我对你的问题的理解,你想在你的例行文件中创建一个练习子集。 以下代码将所有练习添加到您的例程文档中的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", "!!");
                }
            });
        }

    }
});