Библиотека постоянных номеров Android - отношение многих ко многим - PullRequest
0 голосов
/ 24 апреля 2018

Я пытаюсь достичь отношения многие ко многим в Библиотеке постоянства комнаты.Я пытаюсь создать Notes App with Tags.

По идее:

  • В заметке будет несколько тегов.

  • Тег будет иметь несколько заметок.

  • Показать все заметки в RecyclerView вместе с тегами.

Для этого я создал две модели Note.java , Tag.java и TagJoin модель для хранения ч / б заметок и тегов.Достигнуть один-к-одному очень просто, используя аннотацию @Relation.

Вот мои модели

@Entity(tableName = "notes")
public class Note {
    @PrimaryKey
    @NonNull
    public final String id;

    @ColumnInfo(name = "note")
    public String note;

    @Ignore
    public List<Tag> tags;

    @Ignore
    public Note(String note) {
        this(UUID.randomUUID().toString(), note);
    }

    public Note(String id, String note) {
        this.id = id;
        this.note = note;
    }

    public String getId() {
        return id;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note;
    }

    public List<Tag> getTags() {
        return tags;
    }

    public void setTags(List<Tag> tags) {
        this.tags = tags;
    }

    @Entity(tableName = "note_tag_join",
            primaryKeys = {"noteId", "tagId"},
            foreignKeys = {
                    @ForeignKey(
                            entity = Note.class,
                            parentColumns = "id",
                            childColumns = "noteId",
                            onDelete = CASCADE),
                    @ForeignKey(
                            entity = Tag.class,
                            parentColumns = "id",
                            childColumns = "tagId",
                            onDelete = CASCADE)},
            indices = {
                    @Index(value = "noteId"),
                    @Index(value = "tagId")
            }
    )

    public static class TagJoin {
        @NonNull
        public final String noteId;
        @NonNull
        public final String tagId;

        public TagJoin(String noteId, String tagId) {
            this.noteId = noteId;
            this.tagId = tagId;
        }
    }
}

Метки Модель:

@Entity(tableName = "tags", indices = {@Index(value = "name", unique = true)})
public class Tag {
    @PrimaryKey
    @NonNull
    public String id;

    @ColumnInfo(name = "name")
    public String name;

    @Ignore
    public Tag(String name) {
        this(UUID.randomUUID().toString(), name);
    }

    public Tag(String id, String name) {
        this.id = id;
        this.name = name;
    }


    public String getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Примечания Дао:

@Dao
public interface NoteDao {

    @Query("SELECT * FROM notes ORDER BY id DESC")
    LiveData<List<Note>> getAllNotes();

    @Insert
    long insert(Note note);

    @Update
    void update(Note note);

    @Delete
    void delete(Note note);

    @Query("DELETE FROM notes")
    void deleteAll();

    @Query("SELECT COUNT(*) FROM notes")
    int getNotesCount();

    @Query("SELECT notes.* FROM notes\n" +
            "INNER JOIN note_tag_join ON notes.id=note_tag_join.noteId\n" +
            "WHERE note_tag_join.tagId=:tagId")
    List<Note> getAllNotesOfTag(String tagId);

    @Insert
    void insert(Note.TagJoin... joins);

    @Delete
    void delete(Note.TagJoin... joins);
}

Пока все хорошо.Теперь я хочу показать Заметки в RecyclerView, но не могу найти способ получить все Заметки вместе с Тегами одновременно. Одним из способов является получение тегов каждой заметки в методе onBindViewHolder, что я считаю неправильным, поскольку мы должны запрашивать БД каждый раз, когда отображается строка .

Пожалуйста, предоставьте мне предложения.

PS: я следовал коду, указанному в этой статье https://commonsware.com/AndroidArch/previews/mn-relations-in-room

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...