web-dev-qa-db-fra.com

Base de données persistante Room - comment insérer une liste d'éléments dans la base de données quand il n'y a pas de clé primaire associée à la table

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() {
    }
}
7
j2emanue

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; 
}
21
Quang Nguyen

@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.

0
DeaMon1