在 android 中使用 ORMLite 持久化 Collection 类

Posted

技术标签:

【中文标题】在 android 中使用 ORMLite 持久化 Collection 类【英文标题】:Persisting a Collection class with ORMLite in android 【发布时间】:2011-06-07 22:05:09 【问题描述】:

我有两个类设置如下。我很困惑什么时候需要将某些东西注释为外国收藏,什么时候不需要。这听起来也很愚蠢,但ORMLite 文档中没有任何地方说明是否允许非外国集合。如果我有一个 ints 列表,它会自动装箱到 Integers 中怎么办?我可以使用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&lt;Order&gt;ForeignCollection&lt;Order&gt;。任何一个都将设置为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 我只支持CollectionForeignCollection,因为我正在编写支持它们的类。 ListSet 是复杂得多的接口。 那么如何用ORMLite存储ArrayList @Gray 我在文档中看不到有关Collection&lt;Integer&gt;Collection&lt;String&gt; 的任何内容。当我使用其中任何一个时,我得到一个异常说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 游标

android ORMlite的应用

Android平台下使用ormLite的一个小Tip

[ 转]Android快速开发–使用ORMLite操作数据库

Android—Ormlite框架简单的操作数据库