Объединение таблиц в базе данных ROOM

Это моя первая реализация ROOM. У меня есть класс User, который имеет список Pets в качестве одной из переменных-членов.

public class User {
    String id;
    String name;
    List<Pet> pets;
}


Public class Pets {
    String id;
    String type;
}

Как создать классы Entity и DAO для базы данных Room из следующего JSON?

{  
  "users":[  
    {  
      "id":"as123",
      "name":"John",
      "pets":[  
        {  
          "id":"p123",
          "type":"dog"
        }
      ]
    },
    {  
      "id":"as343",
      "name":"Mark",
      "pets":[  
        {  
          "id":"p324",
          "type":"dog"
        },
        {  
          "id":"p254",
          "type":"cat"
        }
      ]
    }
  ]
}

Я создал следующее, но не знаю, как создать правильный столбец или присоединиться к этим таблицам.

Классы сущностей

@Entity(tableName = "user")
public class User {

    @PrimaryKey
    @NonNull
    @ColumnInfo(name = "id")
    String id;

    @Nullable
    @ColumnInfo(name = "name")
    String name;

    List<Pets> pets; // how to set type for Pets
}

@Entity(tableName = "pets",
    foreignKeys = @ForeignKey(entity = User.class,
    parentColumns = "id",
    childColumns = "userId",
    onDelete = CASCADE))
Public class Pets {

    @PrimaryKey
    @NonNull
    @ColumnInfo(name = "id")
    String id;

    @Nullable
    @ColumnInfo(name = "type")
    String type;

    @NonNull
    @ColumnInfo(name = "userId")
    String userId; // for accessing pets of a user
} 

Классы DAO

@Dao
public interface PetsDAO {

    @Insert
    void insert(Pets pets);

    @Update
    void update(Pets... pets);

    @Delete
    void delete(Pets... pets);

    @Query("SELECT * FROM pets WHERE id=:userId")
    List<Pets> getPetsForUser(final String userId);
}

@Dao
public interface UserDAO {

    @Insert
    void insert(User pets);

    @Update
    void update(User... pets);

    @Delete
    void delete(User... pets);

    @Query("SELECT * FROM user)
    List<User> getAllUsers(); // should return list of users with all their pets
}

Как я могу получить List пользователей со всеми их питомцами?


person Abhinav Tyagi    schedule 05.07.2018    source источник


Ответы (1)


Это отношение «многие ко многим», поэтому вам необходимо создать таблицу соединения: таблица UserPetsJoin с petId и userId; Здесь вы можете найти хорошую тему, объясняющую вашу ситуацию: https://android.jlelse.eu/android-architecture-components-room-relationships-bf473510c14a

person Amine Nokra    schedule 05.07.2018
comment
Я проверил, но это сбивает с толку. Q1. Нужно ли мне создавать отдельный POJO для GSON и отдельный класс (Entity) для ROOM? Q2. Нужны ли мне отдельные классы DAO для каждой таблицы или может также обслуживаться один DAO? - person Abhinav Tyagi; 05.07.2018
comment
Q1: вы можете использовать несколько аннотаций в одном POJO. Q2: да, вам нужно создать DAO для каждой таблицы. - person Amine Nokra; 05.07.2018
comment
Это означает, что я могу использовать AutoValue с Room? Я где-то видел, что это не поддерживается, поскольку AutoValue не генерирует сеттеры. - person Abhinav Tyagi; 05.07.2018
comment
Я никогда не использовал AutoValue, но только что увидел, что с его помощью можно создать паттерн Builder. - person Amine Nokra; 06.07.2018
comment
здесь я увидел его stackoverflow.com / questions / 44869545 / - person Abhinav Tyagi; 06.07.2018
comment
Технически это отношения «один ко многим». У одного пользователя много питомцев. - person AndroidDev; 01.07.2019