Android Room - Обработка списка объектов в объекте и запрос результатов

0

Im работает с базой данных в базе данных Android, и у меня возникают некоторые большие проблемы с пониманием того, как:

  1. Когда я добавляю Person в базу данных, он добавляет все свои переменные, например List<Shoe>, List<Pet> и т.д. В базу данных.
  2. Создавайте отношения таким образом, что когда я получаю Person, все его поля извлекаются, например, Pet, Shoe, Shirt и т.д. (Не уверен, какой тип запроса)

  3. Выполните простой запрос, например, "Извлечь Retrieve Person where shoe.name = "boot";

Я знаю, что вы должны использовать отношения внешнего ключа со списком объектов, иначе с помощью одного объекта можно использовать @Embed или @TypeConverter

Пример кода показан ниже;

@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
        }
Теги:
android-room

1 ответ

0

Комната не поддерживает это напрямую из-за некоторых потенциальных проблем с ленивой загрузкой, но с некоторыми обманами DAO это возможно. Вам нужно будет обрабатывать вставки явно, и чтобы запросить все сразу, вам понадобится POJO, чтобы обернуть все это.

@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();

}

Конструкторы, геттеры и сеттеры опущены для краткости.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню