3 votes

Android Room - Gestion de la liste d'objets dans un objet et interrogation du résultat

Je travaille avec la base de données des pièces d'Android et j'ai de gros problèmes pour comprendre comment.. :

  1. Lorsque j'ajoute un Person à la base de données, il ajoute toutes ses variables, par exemple List<Shoe> , List<Pet> etc. à la base de données également.

  2. Créer des relations telles que lorsque je récupère un Person tous ses champs sont récupérés, par exemple Pet, Shoe, Shirt etc. (Je ne suis pas sûr du type de requête dont il s'agit)

  3. Effectuer une requête simple, par exemple Retrieve Person where nom.de la chaussure = "boot" ;

Je sais que vous devez utiliser des relations de type Foreign Key avec une liste d'objets, sinon avec un seul objet on peut utiliser @Embed o @TypeConverter

Un exemple de code est présenté ci-dessous ;

@Entity(tableName = "person")
    public class Person {
        @PrimaryKey
        @NonNull
        private String personId;
        private List<Pet> pets;
        private List<Shoe> shoes;
        private List<Shirt> shirts;
    }

@Entity(foreignKeys = {
        @ForeignKey(
                entity = Person.class,
                parentColumns = "personId",
                childColumns = "personIdFk"
        )
    })
    public class Pet {
        String petId;
        String name;
        String personIdFk; //Foreign key to person
    }

@Entity(foreignKeys = {
            @ForeignKey(
                    entity = Person.class,
                    parentColumns = "personId",
                    childColumns = "personIdFk"
            )
    })
    public class Shoe {
        String shoeId;
        String name;
        String personIdFk; //Foreign key to person
    }

@Entity(foreignKeys = {
        @ForeignKey(
                entity = Person.class,
                parentColumns = "personId",
                childColumns = "personIdFk"
        )
    })
    public class Shirt {
            String shirtId;
            String name;
            String personIdFk; //Foreign key to person
        }

6voto

Thorbear Points 539

La salle ne prend pas directement en charge cette fonction en raison de certains problèmes de sécurité. problèmes potentiels avec le chargement paresseux mais avec quelques astuces de DAO, c'est possible. Vous devrez gérer les insertions de manière explicite, et pour tout interroger en une seule fois, vous aurez besoin d'un POJO pour envelopper le tout.

@Entity(foreignKeys = {
    @ForeignKey(
            entity = PersonEntity.class,
            parentColumns = "personId",
            childColumns = "personIdFk",
            onDelete = CASCADE
    )
})
public class Pet {
    @PrimaryKey
    private String petId;
    private String name;
    private String personIdFk;
}

@Entity(tableName = "person")
public class PersonEntity {
    @PrimaryKey
    private String personId;
}

public class Person {
    @Embedded
    private PersonEntity personEntity;
    @Relation(parentColumn = "personId", entityColumn = "personIdFk")
    private List<Pet> pets;
}

@Dao
public abstract class PersonDao {

    @Insert
    protected abstract void insert(PersonEntity personEntity);

    @Insert
    protected abstract void insert(List<Pet> pets);

    @Transaction
    public void insert(Person person) {
        insert(person.getEntity());
        insert(person.getPets());
    }

    @Query("SELECT * FROM person")
    public abstract List<Person> getAll();

}

@Database(entities = {PersonEntity.class, Pet.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {

    public abstract PersonDao personDao();

}

Constructeurs, récupérateurs et régleurs omis pour des raisons de brièveté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X