如何在没有在一对一映射中使用null实例化变量的情况下构建域数据库?

时间:2016-11-20 14:28:18

标签: java android realm

如果用户可以选择输入以下4个字段之一,我将如何构建我的Realm数据库:a,b,c,d。

目前我已经在一个类中创建了一个包含所有getter和setter的RealmObject模型类,因此如果用户添加到c,则输出如下所示:

[modelClassName = [{a:null},{b:null},{c:6664},{d:null}]]

这是最好的方法吗?或者我应该为每个变量创建一个模型类?后者似乎有点矫枉过正。

1 个答案:

答案 0 :(得分:1)

正如我的文章Designing the Schema of Realm effectively中所提到的,您可以将字段存储在一个“表”中,并存储一个额外的鉴别器字段,用于确定当前哪个字段有效读取。< / p>

所以在你的情况下,

public class Something extends RealmObject {
    public static final String TYPE_A = "a";
    public static final String TYPE_B = "b";
    public static final String TYPE_C = "c";
    public static final String TYPE_D = "d";

    private String a;
    private String b;
    private String c;
    private String d;

    @Index
    private String discriminator;

    public String getA() {
        return a;
    }

    public String getB() {
        return b;
    }

    public String getC() {
        return c;
    }

    public String getD() {
        return d;
    }

    public void setA(String a) {
        this.a = a;
        this.b = null;
        this.c = null;
        this.d = null;
        this.discriminator = TYPE_A;
    }

    public void setB(String b) {
        this.a = null;
        this.b = b;
        this.c = null;
        this.d = null;
        this.discriminator = TYPE_B;
    }

    public void setC(String c) {
        this.a = null;
        this.b = null;
        this.c = c;
        this.d = null;
        this.discriminator = TYPE_C;
    }

    public void setD(String d) {
        this.a = null;
        this.b = null;
        this.c = null;
        this.d = d;
        this.discriminator = TYPE_D;
    }
}

或类似的东西。可以添加其他验证或一些统一的getValue()方法,类型可以由enum代表(并且枚举的name()可以存储在Realm中)等。

事实上,如果您愿意,您甚至可以将所有abcd字段合并到一个名为`value的字段中,并保留鉴别者。

public class Something extends RealmObject {
    public static final String TYPE_A = "a";
    public static final String TYPE_B = "b";
    public static final String TYPE_C = "c";
    public static final String TYPE_D = "d";

    @Index
    private String discriminator;

    private String value;

    // getters, setters

    public void setA(String a) {
        this.value = a;
        this.discriminator = TYPE_A;
    }

    public void setB(String b) {
        this.value = b;
        this.discriminator = TYPE_B;
    }

    public void setC(String c) {
        this.value = c;
        this.discriminator = TYPE_C;
    }

    public void setD(String d) {
        this.value = d;
        this.discriminator = TYPE_D;
    }
}

这取决于你,真的。

此答案适用于Realm 0.88.0 +