У меня есть два объекта: User
и UserType
.Оба загружаются в виде списка из службы REST и хранятся в отдельных таблицах.
Объекты User
, отправляемые службой REST, содержат typeId , который является id из UserType
.UserType
объект должен быть загружен, когда я загружаю User
из моей базы данных.Как мне это сделать?
Примечания:
- Использование
@Embedded
UserType в моем классе User сохранит UserType в базе данных User.Я бы предпочел иметь отдельные таблицы - Использование
@Relation
предназначено для возврата списка пользовательских типов, так что это не соответствует модели. - Использование
@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();
}