Android 如何使用Room从子表中获取父外键的计数

Android 如何使用Room从子表中获取父外键的计数,android,join,sqlite,foreign-keys,android-room,Android,Join,Sqlite,Foreign Keys,Android Room,我有一个父实体集合: @Entity(tableName = "collections") public class Collection implements Serializable { @PrimaryKey @NonNull public String id; public String collTitle; public int isFavorite; public int wordCount; Collection(S

我有一个父实体集合:

@Entity(tableName = "collections")
public class Collection implements Serializable {

    @PrimaryKey
    @NonNull
    public String id;

    public String collTitle;

    public int isFavorite;

    public int wordCount;

    Collection(String collTitle, int isFavorite, int wordCount) {
        this(UUID.randomUUID().toString(), collTitle, isFavorite, wordCount);
    }

    @Ignore
    Collection(@NonNull String id, String collTitle, int isFavorite, int wordCount) {
        this.id = id;
        this.collTitle = collTitle;
        this.isFavorite = isFavorite;
        this.wordCount = wordCount;
    }

}
和子实体词:

@Entity(tableName = "words",
        foreignKeys = @ForeignKey(
                entity = Collection.class,
                parentColumns = "id",
                childColumns = "collId",
                onDelete = SET_DEFAULT),
        indices = @Index("collId"))
public class Word implements Serializable {

    @PrimaryKey
    @NonNull
    public final String id;

    public String wordTitle;

    public String collId;

    public String pageNum;

    public int isFavorite;

    public String wordNotes;

    @Ignore
    Word(String wordTitle, String collId, String pageNum, int isFavorite, String wordNotes) {
        this(UUID.randomUUID().toString(), wordTitle, collId, pageNum, isFavorite, wordNotes);
    }

    Word(@NonNull String id, String wordTitle, String collId, String pageNum, int isFavorite,
         String wordNotes) {
        this.id = id;
        this.wordTitle = wordTitle;
        this.collId = collId;
        this.pageNum = pageNum;
        this.isFavorite = isFavorite;
        this.wordNotes = wordNotes;
    }
}
在插入新集合时,我将wordCount设为0,因为每个新集合都有0个与之关联的单词。但是,在插入新词时,我必须从定义的集合中选择一个集合,并将其“id”用作“collId”(外键)

现在,我需要使用“wordCount”字段检索集合对象列表,该字段包含与每个集合对象关联的实际字数。如前所述,在插入集合对象时,“wordCount”字段的值为0

我只希望我把问题说清楚。请提出一个符合我目的的问题。我不希望结果以新的POJO类的形式出现,比如CollectionsAndWords


任何帮助都将是巨大的帮助

好的,我用以下方法解决了它:

在我的集合实体中,我注释了wordCount,如下所示:

@ColumnInfo(name = "word_count")
    public int wordCount;
并通过删除此字段对构造函数进行了更改:

Collection(String collTitle, int isFavorite) {
        this(UUID.randomUUID().toString(), collTitle, isFavorite);
    }

@Ignore
Collection(@NonNull String id, String collTitle, int isFavorite) {
        this.id = id;
        this.collTitle = collTitle;
        this.isFavorite = isFavorite;
   }
最后,我在DAO中添加了以下查询方法:

@Query("SELECT collections.id, collections.collTitle, collections.isFavorite, " +
            "COUNT(words.collId) as word_count " +
            "FROM collections " +
            "LEFT JOIN words " +
            "ON collections.id = words.collId " +
            "GROUP BY collections.id " +
            "ORDER BY collections.collTitle")
List<Collection> findAllCollsWithCount();
@Query(“选择collections.id、collections.collTitle、collections.isFavorite,”+
“将(words.collId)计数为word\u COUNT”+
“来自集合”+
“左连接词”+
“ON collections.id=words.collId”+
“按集合进行分组。id”+
“按集合排序。标题”)
列出FindAllSwithCount();
以正确的方式使用的左连接为我完成了所有的任务

注意,在上面的查询中,我并没有检索wordCount字段,我只是让一个新字段被计算并映射到wordCount。如果我从collections表中检索wordCount和其他列,我会得到02列,它们的名称为word_count;一个值为0,另一个值为计算值(COUNT())。我还尝试用@Ignore注释wordCount,但是Room找不到任何列来映射wordCount

然而,就目前而言,上述解决方案完全符合我的目的,因此这就是答案。它可能会帮助有同样问题的人

谢谢