在 android 中使用 ORMLite 持久化 Collection 类
Posted
技术标签:
【中文标题】在 android 中使用 ORMLite 持久化 Collection 类【英文标题】:Persisting a Collection class with ORMLite in android 【发布时间】:2011-06-07 22:05:09 【问题描述】:我有两个类设置如下。我很困惑什么时候需要将某些东西注释为外国收藏,什么时候不需要。这听起来也很愚蠢,但ORMLite
文档中没有任何地方说明是否允许非外国集合。如果我有一个 int
s 列表,它会自动装箱到 Integer
s 中怎么办?我可以使用Collection
上方的标准@DatabaseField
来坚持这个吗?根据ORMLite
的说法,一个外国集合还必须有反向引用才能工作(对父级的引用,给予一对多的关系)。对于下面的示例,我假设您应该将 myBList
注释为外部集合以及将 myA
设为外部对象,但是您如何处理 myStringList
?
我在这里看到了示例代码,但它没有回答我的问题:http://ormlite.com/docs/examples
public class A
private Set<B> myBList = new HashSet<B>();
private List<String> myStringList = new ArrayList<String>();
private long id;
public A()
public Set<B> getMyBList()
return myBList;
public void setMyBList(Set<B> myBList)
this.myBList = myBList;
public List<String> getMyStringList()
return myStringList;
public void setMyStringList(List<String> myStringList)
this.myStringList = myStringList;
public void setId(long id)
this.id = id;
public long getId()
return id;
public class B
private int myInt;
private String myString;
private A myA;
private long id;
public B()
public A getMyA()
return myA;
public A setMyA(A a)
myA = a;
public int getMyInt()
return myInt;
public void setMyInt(int myInt)
this.myInt = myInt;
public String getMyString()
return myString;
public void setMyString(String myString)
this.myString = myString;
public void setId(long id)
this.id = id;
public long getId()
return id;
【问题讨论】:
想象一下,如果它是您手动构建的数据库。我认为非外部集合没有意义,因为您需要另一个表(因此是外部表)来进行一对多映射。虽然我可能错了。 【参考方案1】:@Robert 是正确的。当 hibernate 持久化一个集合(甚至是一个数组)时,它会使用带有外部 id 的隐藏的额外表来实现 - 换句话说,隐藏的外部集合。 ORMLite 试图遵守 KISS 原则,因此您是否“手动”定义了外部集合。
我添加了有关存储收藏的更多详细信息。
http://ormlite.com/docs/foreign-collection
这意味着你不能持久化Integer
类型,因为没有foreign-id。此外,您的代码可以定义一个外部集合Collection<Order>
或ForeignCollection<Order>
。任何一个都将设置为ForeignCollection
。 ORMLite 不支持列表或其他集合类型。
【讨论】:
谢谢格雷。这是否意味着您不能保留诸如 Integer 之类的类型,因为 int 内部没有外部 id,将其链接回其所有者?最后,文档声明它只支持“Collections”或“ForeignCollections”。这是否意味着它不支持实现集合的东西,比如列表? 我会加入 Ryans 的问题,是否仅支持集合。毕竟 Collection 不是一个具体的类型,所以也需要一些具体的类型(用于实例化)。问题是 - 列表是集合(它们只是扩展它们),这让我对评论感到困惑......你的意思是说,只允许纯 Collection 实现?我认为很难找到一个纯 Collection 实现(除非您自己编写)。 Set(接口)例如派生自 Collection 和 Iterable。一个实现是 Hashset。 查看文档@Ready4android:ormlite.com/javadoc/ormlite-core/doc-files/ormlite_2.html#SEC30 我只支持Collection
或ForeignCollection
,因为我正在编写支持它们的类。 List
和 Set
是复杂得多的接口。
那么如何用ORMLite存储ArrayListCollection<Integer>
或Collection<String>
的任何内容。当我使用其中任何一个时,我得到一个异常说IllegalArgumentException: ORMLite does not know how to store interface java.util.Collection
【参考方案2】:
如果要将对象的集合(例如 ArrayList)保存到 ORMLite,最简单的方法是:
@DatabaseField(dataType = DataType.SERIALIZABLE)
private SerializedList<MyObject> myObjects;
并获取我的对象列表:
public List<MyObject> getMyObjects()
return myObjects;
【讨论】:
以上是关于在 android 中使用 ORMLite 持久化 Collection 类的主要内容,如果未能解决你的问题,请参考以下文章
如何在 android 中使用 ProGuard 和 OrmLite
在 CursorAdapter 中使用带有 ORMLite 的 Android 游标