リストアイテムを部屋に入れるのに苦労しています。リスト項目は測定と呼ばれ、そのタイプは測定です。リスト項目には、データベースに関連するプライマリキーがありません。しかし、必要であればProductModelに同じ主キーを追加しても問題ありません。
ここに私がこれまで持っているものがあります:
@Entity(tableName = TABLE_NAME)
public class ProductModel {
public static final String TABLE_NAME = "product";
@PrimaryKey
private int idProduct;
private int idCategoryDefault;
@Relation(parentColumn = "idProduct", entityColumn = "idProduct", entity = SortedAttribute.class)
private List<SortedAttribute> sortedAttributes = null;
}
@Entity
public class SortedAttribute {
@PrimaryKey
private int idProduct;
private String reference;
@Embedded
private List<Measurement> measurements = null; //****how do i get this into room ? its a LIST of measurements, not a measurement so calling Embedded i think wont work as it cant flatten it****/
}
public class Measurement {
private String value;
private String valueCm;
public Measurement() {
}
}
Embedded
注釈は、リストではなく、POJO
またはEntity
でのみ使用できます。したがって、この場合、Room
はリストを自動的にフラット化できません。
TypeConverter を使用して、List<Measurement
をString
(JSON
形式)に、またはその逆に。 JSONパーサーライブラリを使用してサポートできます。たとえば、次のようにGsonを使用します。
public class ProductTypeConverters {
@TypeConverter
public static List<Measurement> stringToMeasurements(String json) {
Gson gson = new Gson();
Type type = new TypeToken<List<Measurement>>() {}.getType();
List<Measurement> measurements = gson.fromJson(json, type);
return measurements;
}
@TypeConverter
public static String measurementsToString(List<Measurement> list) {
Gson gson = new Gson();
Type type = new TypeToken<List<Measurement>>() {}.getType();
String json = gson.toJson(list, type);
return json;
}
}
@Entity
@TypeConverters(ProductTypeConverter.class)
public class SortedAttribute {
@PrimaryKey
private int idProduct;
private String reference;
private List<Measurement> measurements = null;
}
@Relationはあなたが探しているものです。
https://developer.Android.com/reference/Android/Arch/persistence/room/Relation.html
ルームドキュメントから:
@Entity
public class Pet {
@ PrimaryKey
int petId;
String name;
}
public class UserNameAndAllPets {
public int userId;
public String name;
@Relation(parentColumn = "petId", entityColumn = "userId")
public List<Pet> pets;
}
@Dao
public interface UserPetDao {
@Query("SELECT petId, name from User")
public List<UserNameAndAllPets> loadUserAndPets();
}
注:さらなる調査の結果、RoomはINSIDEオブジェクトであるオブジェクトのリストをまったくサポートしていません。私(およびその他)は、リストを個別に処理することを選択しました。ルームは、オブジェクト内にない限り、オブジェクトのリストをうまく処理できます。リスト内のアイテムがオブジェクト全体に関連している限り、リストを復元できます。
したがって、実際にはリストを@Ignoreし、Dao抽象クラスで処理するだけです。以前に見つけたSO投稿はこれを描写しています。
編集:型コンバーターを使用する