2016-01-06 62 views
0

我创建了扩展RealmObject的类。 并计划添加Map字段如下,但我注意到Realm不支持Map呢。具有映射字段的Java RealmObject

public class SmsPattern extends RealmObject { 
    @PrimaryKey 
    private String id; 
    @Required 
    private String address; 
    @Required 
    private String regex; 
    @Required 
    private Map<Integer, Integer> regexGroup; 
} 

所以作为替代,我将其转换MapJson String和使用Json String代替Map这样。

public class SmsPattern extends RealmObject { 
    @PrimaryKey 
    private String id; 
    @Required 
    private String address; 
    @Required 
    private String regex; 
    @Required 
    private String regexGroup; 
    @Ignore 
    private Map<Integer, Integer> regexGroupMap; 

    public Map<Integer, Integer> getRegexGroupMap() { 
     Type type = new TypeToken<Map<Integer, Integer>>(){}.getType(); 
     return new Gson().fromJson(getRegexGroup(), type); 
    } 

    public void setRegexGroupMap(Map<Integer, Integer> regexGroupMap) { 
     setRegexGroup(new Gson().toJson(regexGroupMap)); 
    } 
} 

这是一个正常的解决方案吗? 还是更好的主意?

+0

不好意思捎带你的问题。我使用realm 1.1.0,它修复了几个问题,但是我看到一个奇怪的行为,我将值放入我的唯一键控的RealmObject中的(At)Ignore Map字段中,但是当我查询该对象时Map是空的。我想我理解这是为什么(因为(在)忽略字段没有持久性?),但是如何在RealmObject中有任何(at)Ignore字段是有用的?很显然,我必须错过这里明显的东西...... – swooby

回答

1

如果你想有一个类似的RealmObject其行为犹如一张地图,你可以用你自己喜欢这个声明之一:

public class RegexGroup extends RealmObject { 
    @PrimaryKey 
    private int key; 
    private int value 
} 

public class SmsPattern extends RealmObject { 
    @PrimaryKey 
    private String id; 
    @Required 
    private String address; 
    @Required 
    private String regex; 
    private RealmList<RegexGroup> regexGroup; 
} 

的好处比你的JSON字符串的解决方案是

  1. RegexGroup.key被索引,如果你想通过键从它们中查询一个,它会非常快。

  2. 当使用JSON字符串时,您不必将整个“映射”加载到内存中,就像您必须(假设您没有使用流解析器)一样。

  3. 有一个由@PrimaryKey保证的自然限制,你的RegexGroup.key将是唯一的,这使得它更像一个地图。

+0

非常感谢@beeender。但是如何处理两个不同的'''SmsPattern'''''RegexGroup'''具有相同的键? – HoJunLee

+0

在这种情况下,也许你可以使用'String'作为键,然后按照这个模式生成键:'SmsPattern.id_regexGroup.id'。 – beeender