J'ai de la difficulté à placer un élément de la liste dans la pièce. l'élément de liste est appelé mesures et son type est Measurement. l'élément de liste n'a pas de clé primaire qui serait liée à la base de données . mais je n'ai aucun problème pour ajouter la même clé primaire pour le ProductModel si nécessaire.
Voici ce que j'ai jusqu'à présent:
@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() {
}
}
L'annotation Embedded
peut être utilisée sur une POJO
ou une Entity
uniquement, pas pour une liste. Donc, Room
ne peut pas aplatir automatiquement votre liste dans ce cas.
Vous pouvez utiliser TypeConverter pour convertir List<Measurement
en String
(au format JSON
) et inversement. Vous pouvez utiliser n'importe quelle bibliothèque d'analyseur JSON pour la prendre en charge. Par exemple, j'utilise Gson comme suit.
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 est ce que vous recherchez.
https://developer.Android.com/reference/Android/Arch/persistence/room/Relation.html
De la salle de documentation:
@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();
}
Remarque: Après des recherches approfondies, Room ne prend pas en charge les listes d'objets qui sont des objets INSIDE. Moi (et d’autres) avons choisi de traiter les listes séparément. Room peut gérer des listes d'objets parfaitement tant qu'ils ne sont pas dans un objet. ainsi, tant que vos éléments dans la liste sont liés à votre objet global, vous pouvez récupérer la liste.
Donc, vous devriez en fait @ Ignorer la liste et la manipuler dans votre classe abstraite Dao. Je ne pouvais pas trouver les SO messages que j'ai trouvés précédemment qui décrivent ceci.