【发布时间】:2018-07-25 06:53:40
【问题描述】:
我正在为我的项目使用 ROOM。但是我在表之间连接时遇到了麻烦,因为表具有相同的名称字段。
例如,我的项目有树表,“word”&“favorite”&“bookmark”,它们有相同的名称字段。
1- 字
@Entity(tableName = "word")
public class Word {
@NonNull
@PrimaryKey(autoGenerate = true)
private int id;
@NonNull
private String title;
private String mean;
private String pronunciation;
// Getter and Setter
}
2-最喜欢的
@Entity(tableName = "favorite",
foreignKeys = @ForeignKey(
entity = Word.class,
parentColumns = "id",
childColumns = "word_id",
onDelete = CASCADE,
onUpdate = CASCADE))
public class Favorite {
@NonNull
@PrimaryKey
private int word_id;
private long time;
// Getter and Setter
}
3- 书签
@Entity(tableName = "bookmark",
primaryKeys = {"word_id", "category_id"},
foreignKeys = {
@ForeignKey(entity = Word.class,
parentColumns = "id",
childColumns = "word_id",
onDelete = CASCADE,
onUpdate = CASCADE)})
public class Bookmark {
@NonNull
private int word_id;
private long time;
private int color;
// Getter and Setter
}
为了在三者之间建立连接,我定义了一个名为“WordAndFavoriteAndBookmark”的新类型,并使用了“@Embedded”(如下所示)。 为了解决相同的字段问题,我使用 prefix 作为Thomas Fischer 响应
4- WordAndFavoriteAndBookmark
public class WordAndFavoriteAndBookmark {
@Embedded
private Word word;
@Embedded(prefix = "favorite_")
private Favorite favorite;
@Embedded(prefix = "bookmark_")
private Bookmark bookmark;
//Getter and Setter
public Word getWord() { return word; }
public void setWord(Word word) {this.word = word;}
public Favorite getFavorite() { return favorite; }
public void setFavorite(Favorite favorite) { this.favorite = favorite;}
public Bookmark getBookmark() { return bookmark; }
public void setBookmark(Bookmark bookmark) { this.bookmark = bookmark; }
}
为了在这些表之间创建连接,我定义了一个新的 @Dao。
@Dao
public interface WordAndFavoriteAndBookmarkDao {
@Query("SELECT word.*, favorite.time FROM word LEFT JOIN favorite " +
"ON word.id = favorite.word_id")
LiveData<List<WordAndFavoriteAndBookmark>> getAllWordsByFavoritesForLanguage();
}
但同样,在使用查询后,我在视图(活动或片段)中遇到以下代码的错误:
mWordAndFavoriteAndBookmark.getFavorite().getTime();
我认为这是由于使用了Perfix,但我不知道这个问题的解决方案
已编辑: Thomas Fisher 回答,一切都很好。但是当在我的查询中使用“计数”或“总和”时,我无法读取这些值并且我不知道如何读取它们。
【问题讨论】:
标签: android database android-room jointable