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

时间:2013-01-27 04:42:09

标签: android ormlite foreign-collection

我有一个Language实体,其ForeignCollection为Country个实体:

@ForeignCollectionField(eager = false, foreignFieldName = "language")
public ForeignCollection<Country> countries;

我在我的数据库中创建了一个代表法国的国家/地区。后来,我通过查询它的id检索它,我想将它添加到Language的国外国家集合中:

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);
}

但是,标记的行countries.add(country)会导致抛出非法状态异常:

  

01-27 13:39:19.112:E / AndroidRuntime(15614):引起:   java.sql.SQLException:插入数据库失败:INSERT INTO   countriesidentifiernamelanguage_id)价值观(?,?,?)   01-27 13:39:19.112:E / AndroidRuntime(15614):at   com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)

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

2 个答案:

答案 0 :(得分:6)

  

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

这样做是因为它就是这样设计的。引用javadocs for EagerForeignCollection#add()

  

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

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

country.language = language;
dbHelper.getCountryDao().update(country);

然后,如果您想用您所使用的语言刷新您的热切集合:

dbHelper.getLanguageDao().refresh(language); 

答案 1 :(得分:2)

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

顺便说一下,已经完成并关闭的票证(#31)包含应该自动设置集合元素上的父字段值的更改。但即使在4.45中,我仍然需要手动执行此操作。我错过了什么或可能做错了吗?

相关问题