Привет и спасибо за замечательную статью :)
Я спрошу вас, есть ли возможность отображать отношения типа 1-к-1.
например: у меня есть объект пользователя с ключом addressId FK на объекте Address с идентификатором PK.
Как я могу отобразить это? Я только что отметил аннотацию @Embedded, но в моей БД у меня есть две отдельные таблицы (пользовательская и адресная), и я хочу сохранить инкапсуляцию на стороне Java:
Просто быть чистым:
@Entity(tableName = "user", foreignKeys = @ForeignKey(entity = Address.class, parentColumns = "id", childColumns = "address", onDelete = ForeignKey.NO_ACTION)) public class User { @PrimaryKey @NonNull private String id; @ColumnInfo(name = "name") private String name; @ColumnInfo(name = "surname") private String surname; private Address address; <-- I need to map this
Ниже приведен SQL, используемый для получения всех данных о пользователе и связанном адресе:
@Query("SELECT * FROM user u LEFT JOIN addresses a ON a.id = u.address WHERE u.id= :id") LiveData<User> loadUser(String id);
Приведенный выше запрос возвращает все свойства из таблиц User и Address, поэтому я предположил, что мне нужно реализовать свой собственный Converter для создания адреса пользователя из «адреса» FK, как показано ниже:
public class AddressConverter { @TypeConverter public static Address idToAddress(String id, String address, String city){ Address a = new Address(); a.setId(id); a.setCity(city); a.setAddress(address); return a; } @TypeConverter public static String addressToId(Address address){ return address!=null ? address.getId() : null; } }
но для TypeConverter требуется только один вход, и он не может сканировать курсор в поисках совпадающих параметров (возможно, это может быть хорошим улучшением;)).
Как мы можем это сделать?
Спасибо!