如果用户可以选择输入以下4个字段之一,我将如何构建我的Realm数据库:a,b,c,d。
目前我已经在一个类中创建了一个包含所有getter和setter的RealmObject模型类,因此如果用户添加到c,则输出如下所示:
[modelClassName = [{a:null},{b:null},{c:6664},{d:null}]]
这是最好的方法吗?或者我应该为每个变量创建一个模型类?后者似乎有点矫枉过正。
答案 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中)等。
事实上,如果您愿意,您甚至可以将所有a
,b
,c
,d
字段合并到一个名为`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 +