【问题标题】:Realm ORM: how to deal with Maps?Realm ORM:如何处理 Maps?
【发布时间】:2016-02-10 09:50:52
【问题描述】:

我正在创建一个 Android 应用程序,我需要保留 Map<String,MyClass>。 我刚刚开始使用Realm ORM,因为它支持一对一和一对多、枚举和列表。我还找到了字符串列表的解决方法(即我必须创建一个封装字符串的 StringWrapper 类。 但是,从documentation 我了解到没有像RealmMap 这样的简单方法,因为它发生在列表中。 所以,我正在寻找持久化地图的最佳方式。 我目前的想法是用对象列表替换我的地图KeyValueObject,其中封装了String(前地图键)和MyClass。类似于Map.Entry。 是否有任何其他解决方案不需要我出于技术原因重新设计域模型?

【问题讨论】:

  • 您是否愿意考虑另一种持久性产品?假设 Map 对象是包含模型类的属性,将 Map 对象存储在数据库中的 blob 列中是否满足您的应用程序需求?
  • 两个问题都同意
  • 请查看 JDXA ORM (softwaretree.com/v1/products/jdxa/jdxa.html)。 JDXA 支持一对一、一对多和多对多关系。 JDXA 还支持将嵌入对象(例如 HashMap)存储在 BLOB 列中的概念。虽然您不能根据 HashMap 值进行任何查询,但 JDXA 会在查询期间为您重建嵌入的 HashMap 对象。

标签: java android realm


【解决方案1】:

如您所见,Realm 还不支持地图:https://github.com/realm/realm-java/issues/759

您可以使用模型类:

class MyData extends RealmObject {
    private RealmList<MyMapEntry> myMap;
}

class MyMapEntry extends RealmObject {
    private String key;
    private MyClass value;
}

假设您有一个名为myDataMyData 对象,并且您希望获取与myKey 关联的值,那么查询MyClass myClass = myData.getMyMap().where().equalTo("key", myKey).firstFirst() 可能会有用。

【讨论】:

  • 请注意,这可能会导致一些限制,如question中所示
【解决方案2】:

好吧,如果您确实有幸对持久层进行了一些修改,那么最简单的解决方案就是根本不使用Map&lt;String

Map&lt;String 字面意思是一个特定的字符串与一个对象相关联。您可以通过将该字符串作为 RealmObject 的一部分来执行相同的操作。然后就可以据此查询了。

因此,任何带有字符串查询的 RealmResults` 都将包含一个元素,该元素将是所述地图的值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    相关资源
    最近更新 更多