database - Android Room Persistence Library - 多对多关系
问题描述
我正在尝试在 Room Persistence Library 中实现多对多关系。我正在尝试创建一个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
解决方案
推荐阅读
- javascript - 如何在 replit(在线 ide)中运行多个 javascript 文件?
- asp.net - List.Add 正在替换索引 0 而不是添加到下一个位置。为什么?
- python - 使用 Python 的 Selenium 无法完全打开网站
- javascript - 为什么调度操作会重写我的商店价值?
- javascript - cy.visit() 必须使用 url 或包含 url 作为其第一个参数的选项对象调用 - Cypress.env('StudentPortal')
- confluence - 通过 confluence 插件创建的 Confluence 嵌入式 draw.io png 不包含 xml 元数据
- r - 在“R”中制作圆形条形图
- python - 使用正则表达式 #Python #Regex 从字符串中获取一个序列
- python - 传递一个变量来引用实例属性
- docker - 如何在 docker 容器中设置卷挂载的 uid/gid