Java 使用外部集合字段创建表
我有一个抽象类: 域项Java 使用外部集合字段创建表,java,ormlite,foreign-collection,Java,Ormlite,Foreign Collection,我有一个抽象类: 域项 abstract public class DomainItem { @DatabaseField(generatedId = true) protected long id; @ForeignCollectionField(eager = false) protected ForeignCollection<ContentItem> contentItens; //getters and setters
abstract public class DomainItem {
@DatabaseField(generatedId = true)
protected long id;
@ForeignCollectionField(eager = false)
protected ForeignCollection<ContentItem> contentItens;
//getters and setters
}
这些(无摘要):
植翅目含量
@DatabaseTable(tableName = "phytoterapiccontent")
public class PhytoterapicContent extends ContentItem {
@DatabaseField(canBeNull = false)
private String defaultName;
@DatabaseField(canBeNull = false)
private String scientificName;
//getters and setters
}
在我的DatabaseHelper中,我尝试创建表:
//DatabaseHelper
...
@Override
public void onCreate(SQLiteDatabase db, ConnectionSource connectionSource) {
try {
Log.i(TAG, "onCreate");
TableUtils.createTable(connectionSource, PhytoterapicContent.class);
Log.i(TAG, "Created table PhytoterapicContent");
TableUtils.createTable(connectionSource, PhytoterapicItem.class);
Log.i(TAG, "Created table PhytoterapicItem");
catch{
...
}
此时将创建表内容。但我得到了以下错误:
java.sql.SQLException:字段“contentItens”列名的外部集合类br.com.project.model.ContentItem不包含类br.com.project.model.phytterapicItem的外部字段
因此,异常消息的目的是在这里提供帮助。要在删除类名的情况下引用它,请执行以下操作: 字段
contentItens
的外部集合类ContentItem
列名不包含类PhytoterapicItem
看来是这样的。无论何时拥有ForeignCollection
,该集合包含的类都必须有一个外部字段返回到父类
在您的例子中,phyterapicitem
扩展了DomainItem
类,该类具有ContentItem
对象的ForeignCollection
。这意味着ContentItem
必须具有类型为PhytoterapicItem
的外部字段。否则,如何知道表中的哪些ContentItem
项与特定的PhytoterapicItem
关联
中的
Account
和Order
对象的示例可能对您的架构有所帮助。每个帐户
都有一个订单
对象的外部集合。无论何时查询帐户
都会执行单独的查询,以查找与特定帐户
对应的订单
对象的集合。这意味着每个订单
都必须有一个外部帐户
对象。我花了一段时间才从文档()中注意到/理解这个关键块:
请记住,当您拥有ForeignCollection字段时,集合中的类必须(按此示例顺序)拥有集合的类(在本示例中为Account)的外部字段。如果帐户具有订单的外部集合,则订单必须具有“帐户外部”字段。它是必需的,以便ORMLite可以找到与特定帐户匹配的订单
我之所以感到困惑是因为我没有找到任何示例代码(在文档或示例项目中),其中“包含的类”引用了集合中的类。它是口头描述的,但考虑到关系的性质——对于一些人来说,我认为在最初几次看到它时,这种描述可能有点难以理解
正如上面在原始问题中所列出的(这是我最终获得尝试我偶然发现的解决方案的想法的原因),下面的示例块似乎是在OrmLite中映射一对多集合关系的正确方法
此外,还有一个关于如何将collection holder类设置为collection元素类的说明
以下是需要注意的主要步骤: A.在具有集合的类中(本例中为DomainItem),按以下方式注释集合字段:
@ForeignCollectionField(eager=true)
B.在集合中包含的类中(在本例中为ContentItem),必须有一个对包含集合的父类的显式引用:
@DatabaseField(foreign=true)
受保护的DomainItem DomainItem代码>
C.在持久化ContentItem之前,必须将DomainItem保存到该ContentItem,以便将外键设置回DomainItem:
curContentItem.setDomainItem(curDomainItem);
contentItemDao.create(curContentItem);`
当我的藏品一开始没有被取回时,我就发现了这一点。我查看了ContentItem表,但DomainItem\u id从未设置在那里
例如:
public class DomainItem {
@DatabaseField(generatedId = true)
protected long id;
@ForeignCollectionField(eager = false)
protected ForeignCollection<ContentItem> contentItens;
// ...
}
public class ContentItem {
@DatabaseField(generatedId = true)
protected long id;
@DatabaseField(foreign = true)
protected DomainItem domainItem;
public void setDomainItem(DomainItem domainItem) {
this.domainItem = domainItem;
}
}
公共类DomainItem{
@数据库字段(generatedId=true)
保护长id;
@ForeignCollectionField(eager=false)
受保护的外国收藏品;
// ...
}
公共类ContentItem{
@数据库字段(generatedId=true)
保护长id;
@数据库字段(外部=真)
受保护的DomainItem DomainItem;
公共无效setDomainItem(DomainItem DomainItem){
this.domainItem=domainItem;
}
}
有效!我找出了抽象类之间的关系。现在它们在每个“项目”和各自的“内容”中。谢谢!!!
curContentItem.setDomainItem(curDomainItem);
contentItemDao.create(curContentItem);`
public class DomainItem {
@DatabaseField(generatedId = true)
protected long id;
@ForeignCollectionField(eager = false)
protected ForeignCollection<ContentItem> contentItens;
// ...
}
public class ContentItem {
@DatabaseField(generatedId = true)
protected long id;
@DatabaseField(foreign = true)
protected DomainItem domainItem;
public void setDomainItem(DomainItem domainItem) {
this.domainItem = domainItem;
}
}