我的目标是 Android 2.2 及更高版本。此错误是在运行 4.x 的设备上生成的。我正在使用 ORMLite 4.38 库。
我需要保证每个记录实例对于任意数量的设备都是唯一的。我很高兴看到 ORMLite 支持 UUID 作为 ID。我为我的数据库记录定义创建了一个 UUID - id 抽象基类。 allowGeneratedIdInsert
是完美的解决方案。但此功能似乎会导致“IllegalStateException:无法在 dao 中创建数据元素”。我通过删除此注释进行了测试,没有问题。把它放回去......同样的问题。将基类的东西放在一个记录定义中......同样的问题。
LogCat 还报告:
原因:java.sql.SQLException: Unable to run insert stmt on object - objectid: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx
public abstract class UUIDDaoEnabled<T> extends BaseDaoEnabled<T, UUID> {
//allowGeneratedIdInsert allows us to set UUID when this device db didn't create it
@DatabaseField(generatedId = true, allowGeneratedIdInsert=true)
private UUID id;
...
public void setUUIDFromSerializedSource(SerializedModelBinaryInputStream stream, Dao<T, UUID> dao) throws SQLException { //only place we can set UUIDs
if(id == null)
dao.refresh((T)this);
if(id != null)
throw new SQLException("Trying to set UUID on existing object");
id = stream.getCurrentUUID();
}
}
我会像这样专门化:
@DatabaseTable()
public class Type extends UUIDDaoEnabled<Type> { ... }
我无法从allowGeneratedIdInsert
and的文档中解释这一点generatedId
。实际上 alloeGeneratedIdInsert 的文档说它覆盖了 generatedId 的默认行为。它还说
这仅在数据库支持此行为时才有效
然而,我在其他帖子中读到 ORMLite 4.25 (?) 和更新版本在 Android 设备上支持这种行为。所以,这也不完全正确。或者我在做一些愚蠢的事情......任何人???
更新:考虑了一分钟后,我意识到allowGeneratedIdInsert
支持和继承都不是根本原因,因为我基于同一个抽象类实例化了其他对象。我无法弄清楚为什么一个特定的班级会导致这个问题。关于违规记录类型的唯一独特之处(与创建的其他类型相比)是一对多中的多,并且包含多对多。这些属性与 结合起来allowGenereatedIdInsert
会是根本问题吗?相反,我应该问,有没有人在这种情况下看到这个问题?
更新:没关系这个问题。我可以使用updateId(...)
而不是allowGeneratedIdInsert
.