领域:处理相关的被忽略字段的正确方法

时间:2017-12-03 18:20:52

标签: android realm realm-mobile-platform

我在Realm中有一个带有枚举字段的modell类。 因为枚举不是有效的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来保持两个值同步。但是,当从数据库中获取实体时,不会调用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;
    }   
}

在这个例子中,它是一种过度杀伤,但是使用相同的机制来解析字符串值并且解析是一个代价高昂的过程。

即使值可以更改(在此代码之外),但是引入了大量的锅炉代码(并使用三个字段来代表一个),这仍然有效,所以我仍然怀疑它是否是正确的解决方案。

1 个答案:

答案 0 :(得分:1)

您可以像这样更改SELECT B.DATE, B.GROUPING_ID, MAX(A.VALUE) AS VALUE FROM TABLE_1 A INNER JOIN TABLE_1 B ON A.GROUPING_ID = B.GROUPING_ID AND A.DATE<=B.DATE GROUP BY B.DATE, B.GROUPING_ID; 方法

getType()
相关问题