Работа со многими ко многим и GreenDao 3.1.0 - Android

У меня есть 2 сущности Mood, MoodNote, и я получаю их из веб-сервиса в виде списка 1 json.

Образец Json:

{  
  "id":1,
  "name":"Sad",
  "created_at":"2016-08-11 19:59:43",
  "updated_at":"2016-08-16 20:15:17",
  "deleted_at":null,
  "symbol":"\\uD83D\\uDE22",
  "notes":[
    {  
      "id":409,
      "content":"Recusandae necessitatibus numquam consectetur ut.",
      "created_at":"2016-08-11 20:01:18",
      "updated_at":"2016-08-11 20:01:18",
      "deleted_at":null,
      "count":0,
      "pivot":{  
        "id_mood":1,
        "id_modenote":409,
        "created_at":"2016-08-11 20:01:19",
        "updated_at":"2016-08-11 20:01:19"
      }
    },
    {  
      "id":269,
      "content":"Nulla laudantiums quia impedit.",
      "created_at":"2016-08-11 20:01:18",
      "updated_at":"2016-08-11 20:01:18",
      "deleted_at":null,
      "count":0,
      "pivot":{  
        "id_mood":1,
        "id_modenote":269,
        "created_at":"2016-08-11 20:01:19",
        "updated_at":"2016-08-11 20:01:19"
      }
    },
    {  
      "id":204,
      "content":"Incidunt doloremque",
      "created_at":"2016-08-11 20:01:18",
      "updated_at":"2016-08-11 20:01:18",
      "deleted_at":null,
      "count":0,
      "pivot":{  
        "id_mood":1,
        "id_modenote":204,
        "created_at":"2016-08-11 20:01:19",
        "updated_at":"2016-08-11 20:01:19"
      }
    },
  ]
}

Отношение между ними много ко многим.

Теперь это классы сущностей:

@Entity
public class Mood {
    @Id
    @SerializedName("id")
    @Expose
    private Long id;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("created_at")
    @Expose
    private String createdAt;
    @SerializedName("updated_at")
    @Expose
    private String updatedAt;
    @SerializedName("deleted_at")
    @Expose
    private String deletedAt;
    @SerializedName("symbol")
    @Expose
    private String symbol;

    @ToMany
    @JoinEntity(
            entity = JoinMoodNote.class,
            sourceProperty = "moodId",
            targetProperty = "moodNoteId"
    )
    @SerializedName("notes")
    @Expose
    private List<MoodNote> notes = new ArrayList<>();

}

Примечание настроения:

@Entity
public class MoodNote {
    @Id
    @SerializedName("id")
    @Expose
    private Long id;
    @SerializedName("content")
    @Expose
    private String content;
    @SerializedName("created_at")
    @Expose
    private String createdAt;
    @SerializedName("updated_at")
    @Expose
    private String updatedAt;
    @SerializedName("deleted_at")
    @Expose
    private String deletedAt;
    @SerializedName("count")
    @Expose
    private int count;
}

И в этом уроке: ССЫЛКА, они упоминали, чтобы делать так

@Entity
public class JoinMoodNote {
    @Id private Long id;
    private Long moodId;
    private Long moodNoteId;
}

после этого они не упоминали, как установить или получить данные

Мне нужен любой пример ManyToMany или намек на его использование.

Я пытался получить настроение с помощью модернизации, и я получил список настроений

// This only insert the moods, it doesnt insert the MoodNote list
moodDao.insertTx(moods);

1 ответ

Решение

Я решил проблему, добавив записи в базу данных вручную:

moodDao.insertInTx(moodsList); // inserting all moods 
daoSession.runInTx(new Runnable() {
    @Override
    public void run() {
        // Foreach mood get the moodNotesList and add it to database
        for (Mood mood : moodsList) {
            long moodId = mood.getId();
            for (MoodNote note : mood.getMoodNotes()) {
                note.setMoodId(moodId); // nothing but set the moodId of the MoodNote to keep the relation
                moodNoteDao.insert(note); // insert the moodNote to database one by one
            }
        }
    }
});

Это не идеальное решение, но оно решило мою проблему.

Если я найду лучшее решение, я опубликую его здесь, если у вас есть лучшее решение, пожалуйста, напишите в качестве ответа, чтобы мы его изучили.

Спасибо.

Другие вопросы по тегам