2017-12-03 17 views
0

열거 형 필드가있는 영역에 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 개의 필드를 사용하여 하나의 필드를 나타냄), 올바른 솔루션 일 경우 여전히 의심 스럽습니다. .

답변

1

당신이

public Type getType() { 
    if(type == null && typeCode != null) { 
     this.type = Type.valueOf(typeCode); 
    } 
    return type; 
} 
+0

게으른 초기화처럼 getType() 방법을 변경할 수있는 것은 한 값을 변경할 수있는 좋은 솔루션입니다. 가능한 경우 솔루션이 더러워집니다. setTypeCode에도 동일한 코드를 추가해야합니다. 정답이지만 Realm이이 솔루션을 우리에게 강요하는 방법을 완전히 만족하지는 않습니다. 더 많은 보일 러 코드입니다. – Balage1551