Android ORMLite并将现有的持久化实体添加到外部字段集合

Android ORMLite并将现有的持久化实体添加到外部字段集合,android,ormlite,foreign-collection,Android,Ormlite,Foreign Collection,我有一个语言实体,拥有国家实体的国外集合: @ForeignCollectionField(eager = false, foreignFieldName = "language") public ForeignCollection<Country> countries; @ForeignCollectionField(eager=false,foreignFieldName=“language”) 公共外汇收集国; 我在数据库中创建了一个国家,比如代表法国。稍后,我通过查询其i

我有一个
语言
实体,拥有
国家
实体的国外集合:

@ForeignCollectionField(eager = false, foreignFieldName = "language")
public ForeignCollection<Country> countries;
@ForeignCollectionField(eager=false,foreignFieldName=“language”)
公共外汇收集国;
我在数据库中创建了一个国家,比如代表法国。稍后,我通过查询其id来检索它,并希望将其添加到一种语言的国外国家/地区集合中:

Country country = dbHelper.getCountryDao().queryForId(countryId);
if (country != null) {
    country.language = language;    
    ForeignCollection<Country> countries = language.countries;
    if (countries == null) {
        countries = dbHelper.getLanguageDao().getEmptyForeignCollection("countries");
    }
    countries.add(country); // Illegal state exception thrown here
    language.countries = countries;
    dbHelper.getLanguageDao().create(language);
}
Country-Country=dbHelper.getCountryDao().queryForId(countryId);
如果(国家/地区!=null){
国家语言=语言;
国外收集国家=语言。国家;
如果(国家==null){
countries=dbHelper.getLanguageDao().getEmptyForeignCollection(“国家”);
}
countries.add(country);//此处引发非法状态异常
语言。国家=国家;
dbHelper.getLanguageDao().create(语言);
}
但是,标记行
countries.add(country)
会引发非法状态异常:

01-27 13:39:19.112:E/AndroidRuntime(15614):由以下原因引起: java.sql.SQLException:插入到数据库失败:插入到
国家
标识符
名称
语言id
)值(?,?) 01-27 13:39:19.112:E/AndroidRuntime(15614):在 com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)

为什么
.add()
会触发数据库和内部DAO中现有实体的重新创建?我该怎么做呢

为什么.add()会触发数据库和内部DAO中现有实体的重新创建

它这样做是因为它就是这样设计的。引述:

向集合中添加元素。这还会将该项添加到关联的数据库表中

该国家/地区已存在于表中,因此引发异常。您可以通过执行以下操作将现有国家/地区与语言关联:

country.language = language;
dbHelper.getCountryDao().update(country);
然后,如果要使用您所使用的语言刷新您的“渴望”集合,请执行以下操作:

dbHelper.getLanguageDao().refresh(language); 

现在我得到了一个SQL异常,如果我向集合添加一个已经创建的元素,因为集合实现的
add()
中有
dao.create()
。但在相当长的一段时间内,我们得到了一个
dao.createOrUpdate()
方法,它更适合这种情况,因为如果集合中有一个已经创建的实体,它将执行更新或什么都不做。是否可以在源代码中更改此选项


顺便说一句,有一个已完成且已关闭的票证(),其更改应自动设置集合元素上的父字段值。但即使在4.45版本中,我仍然必须手动执行此操作。我是错过了什么还是可能做错了什么

同时,在不知道更多的情况下,我捕捉到了异常并继续。讨厌。但是添加的对象存在于集合中,并且集合仍然存在。