Android Room отношение в отдельной таблице - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть два объекта: User и UserType.Оба загружаются в виде списка из службы REST и хранятся в отдельных таблицах.

Объекты User, отправляемые службой REST, содержат typeId , который является id из UserType.UserType объект должен быть загружен, когда я загружаю User из моей базы данных.Как мне это сделать?

Примечания:

  1. Использование @Embedded UserType в моем классе User сохранит UserType в базе данных User.Я бы предпочел иметь отдельные таблицы
  2. Использование @Relation предназначено для возврата списка пользовательских типов, так что это не соответствует модели.
  3. Использование @TypeConverter, как описано здесь https://medium.com/@josephdalughut/saving-embedded-entities-to-separate-room-tables-using-typeconverters-635f9e189e89 невозможно: когда я сохраняю пользователя, его объект UserType будет уменьшен до id .Когда я загружаю этого пользователя, id будет заменен на UserType.Проблема здесь в том, что служба REST отправляет только typeId , что означает, что для каждого пользователя в полученном списке, перед его сохранением, мне нужно будет извлечь UserType и установить его для пользователя, просто чтобыразрешить TypeConverter преобразовать этот UserType обратно в его идентификатор.

User:

@Entity(tableName = "users",
        foreignKeys = @ForeignKey(
        entity = UserType.class, 
        parentColumns = "id", 
        childColumns = "typeId", 
        onDelete = ForeignKey.SET_NULL, 
        onUpdate = ForeignKey.CASCADE),
        indices = @Index("typeId"))
public class User {

    @PrimaryKey
    @SerializedName("Id")
    protected long id = -1;

    @SerializedName("Password")
    private String password;

    @SerializedName("FirstName")
    private String firstName;

    @SerializedName("LastName")
    private String lastName;

    @SerializedName("GsmNumber")
    private String gsmNumber;

    @SerializedName("BirthDay")
    private Date birthDay;

    @SerializedName("TypeId")
    private long typeId;

    // ???
    private UserType userType;

    public User() {

    }

    // getters and setters
}

@Dao
public interface UserDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void save(User u);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void save(List<User> us);

    @Delete
    void delete(User u);

    @Delete()
    void delete(List<User> us);

    @Query("SELECT * FROM users WHERE id = :id")
    User load(long id);

    @Query("SELECT * FROM users")
    LiveData<List<User>> getAll();
}

UserType:

@Entity(tableName = "usertypes")
public class UserType {

    private int color;

    public UserType() {

    }

    // getters setters
}

@Dao
public interface UserTypeDao {

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void save(UserType t);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void save(List<UserType> ts);

    @Delete
    void delete(UserType t);

    @Delete()
    void delete(List<UserType> ts);

    @Query("SELECT * FROM usertypes WHERE id = :id")
    UserType load(long id);

    @Query("SELECT * FROM usertypes")
    LiveData<List<UserType>> getAll();
}
...