java - 如何在一对一映射中不使用 null 实例化变量的情况下构建 Realm 数据库?

标签 java android realm

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

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

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

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

最佳答案

正如我的文章中提到的Designing the Schema of Realm effectively ,您可以将字段存储在一个“表”中,并存储一个附加的鉴别器字段,该字段确定当前可以有效读取哪个字段。

所以就你而言,

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 字段转换为 1 个名为“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+

关于java - 如何在一对一映射中不使用 null 实例化变量的情况下构建 Realm 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40705213/

相关文章:

java - 无法使用多个 XSD schemaLocation 验证 XML

java - 不同版本的相同jar中的重复类-Android

android - Videoportal PWA(Progressive Web App)视频离线功能?

android - 服务器收到订阅状态更改通知时如何识别用户

swift - Realm :无法使用 'add(_:update:)' 类型的参数列表调用 '(String)'

swift - 如何在一对多关系中从特定列表中查询特定项目

java - 如何以左右水平可导航样式显示小图片图标库,就像在 JavaScript/JQuery 中一样

java - 如何使用比较器对 ArrayList 进行排序?我排序的变量是一个 int

android - 获取应用程序的可用语言

ios - Realm verify_thread 崩溃