0
votes

Data Hierarchy is :

  1. Place
    • id
    • name
    • images
      • original_image
        • id
        • image_url
        • width
        • height
      • thumbnail_image
        • id
        • image_url
        • width
        • height

The original_image equals with thumbnail_image.

My Place class is

@Entity
class PlaceEntity(.....) {
    @PrimaryKey
    var id: Int = id

    var name: String = name

    @Embedded
    var images: Images = images
}

My Images class is

class Images(.....) {
    @Relation(parentColumn = "origin_id", entityColumn = "id")
    var original: Image = original

    @Relation(parentColumn = "thumb_id", entityColumn = "id")
    var thumbnail: Image = thumbnail
}

My Image class is

class Image(.....) {
    var id: Int = id
    var url: String = url
    var width: Int = width
    var height: Int = height
}

When I compiled this project, room library returns error

error: Cannot find the parent entity column origin_id in com.test.room.entity.Images. Options: private com.test.room.entity.Image original;

error: Cannot find the parent entity column thumb_id in com.test.room.entity.Images. Options: private com.test.room.entity.Image thumbnail;

error: Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type). public final class Images {

3

3 Answers

1
votes

Use your 'Images' class as Entity just like 'PlaceEntity'.

1
votes

Unless you give column name specifically, ROOM assigns column name same as variable name while creating tables.

In your case, you should give your parent class @ColumnInfo(name="") annotation to specify column name of table which should other than variable name.

So, PlaceEntity would be

@Entity
class PlaceEntity(.....) {
    @PrimaryKey
    @ColumnInfo(name="place_id") // Add this to determine column name
    var id: Int = id

    var name: String = name

    @Embedded
    var images: Images = images
}

By relation Images class is child for PlaceEntity, parentColumn should be place_id in your case.

class Images(.....) {
    @Relation(parentColumn = "place_id", entityColumn = "id") // Parent column should be 'place_id'
    var original: Image = original

    @Relation(parentColumn = "place_id", entityColumn = "id")
    var thumbnail: Image = thumbnail
}
0
votes

Thanks for all answers.

I found solutions this question.

Heres my classes.

@Entity
class PlaceEntity(.....) {
    @PrimaryKey
    var id: Int = id

    var name: String = name

    @Embedded(prefix = "imgs_")
    var images: Images = images
}


class Images(.....) {
    @Embedded(prefix = "origin_")
    var original: Image = original

    @Embedded(prefix = "thumbs_")
    var thumbnail: Image = thumbnail
}

Thanks for all answers again!