열거 형 필드가있는 영역에 Modell 클래스가 있습니다. enum은 유효한 Realm 데이터 유형이 아니기 때문에 계속 유지하려면 몇 가지 트릭을 만들어야합니다.영역 : 관련 필드를 처리하는 올바른 방법
public class Parameter extends RealmObject {
public enum Type {
STRING, INTEGER, BOOLEAN
}
@PrimaryKey
private int id;
private String code;
private String name;
// This is the persisted field
private String typeCode;
// This is the transient field
@Ignore
private Type type;
public Parameter() {
Log.d("REALM", "Parameter created");
}
@Override
public int getId() { return id; }
public void setId(int id) { this.id = id; }
public String getCode() { return code; }
public void setCode(String code) { this.code = code; }
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public Type getType() { return type; }
public void setTypeCode(String typeCode) {
Log.d("REALM", "Parameter setTypeCode called");
// Sets both fields
this.typeCode = typeCode;
this.type = Type.valueOf(typeCode);
}
public void setType(Type type) {
Log.d("REALM", "Parameter setType called");
this.type = type;
this.typeCode = type.name();
}
}
제 아이디어는 두 값을 동기화하여 유지하는 것입니다. 그러나 엔티티가 데이터베이스에서 가져올 때 setter는 호출되지 않습니다 (필드가 직접 설정되어있는 것처럼 보입니다). 그것은 제가 올바른 접근법을 사용하지 않는다고 느끼게합니다.
지원되지 않는 데이터 유형의 매핑을 구현하는 올바른 방법은 무엇입니까?
참고 :이 경우 유형 필드를 삭제하고 문자열 값을 즉석에서 다시 매핑 할 수 있습니다.이 경우 무서운 것이지만이 경우 무해하지만 계속 유지되는 문자열 값이 있어야하는 또 다른 문제가 있습니다. 그곳에는 더럽지 만 비효율적 일뿐입니다.
편집 # 1
만큼 내가 어떤 더 나은 솔루션을 찾을 수 없습니다, 나는 다음과 같은 한 : 내가 마지막으로 변환 된 값을 저장하는 또 하나의 문자열 과도 필드를 생성 및 주문형 전환을했다. 이 예에서
public class Parameter extends RealmObject {
public enum Type {
STRING, INTEGER, BOOLEAN
}
[...]
// This is the persisted field
private String typeCode;
// This is a transient field to store last parsed value
@Ignore
private String lastParsedTypeCode;
// This is the transient field
@Ignore
private Type type;
private void reparseValue() {
if (typeCode == null) {
lastParsedTypeCode = null;
type = null;
} else if (!typeCode.equals(lastParsedTypeCode)) {
lastParsedTypeCode = typeCode;
type = Type.valueOf(typeCode);
}
}
public Type getType() {
reparseValue();
return type;
}
public void setTypeCode(String typeCode) {
Log.d("REALM", "Parameter setTypeCode called");
this.typeCode = typeCode;
}
public void setType(Type type) {
Log.d("REALM", "Parameter setType called");
this.type = type;
setTypeCode(type == null ? null : type.name());
this.lastParsedTypeCode = typeCode;
}
}
, 그것은 잔인한 있지만 문자열 값을 해석해야하는 경우와 동일한 메커니즘을 사용하여 해석 할 수있는 비용이 많이 드는 과정이다.
값이 (이 코드 외부에서) 변경 될 수있는 경우에도 작동하지만 많은 양의 보일러 코드를 가져오고 (3 개의 필드를 사용하여 하나의 필드를 나타냄), 올바른 솔루션 일 경우 여전히 의심 스럽습니다. .
게으른 초기화처럼
getType()
방법을 변경할 수있는 것은 한 값을 변경할 수있는 좋은 솔루션입니다. 가능한 경우 솔루션이 더러워집니다. setTypeCode에도 동일한 코드를 추가해야합니다. 정답이지만 Realm이이 솔루션을 우리에게 강요하는 방법을 완전히 만족하지는 않습니다. 더 많은 보일 러 코드입니다. – Balage1551