2016-01-06 38 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

相關問題