【发布时间】:2013-02-02 02:33:14
【问题描述】:
我的目标是 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 和 generatedId 的文档中解释这一点。实际上 alloeGeneratedIdInsert 的文档说它覆盖了 generatedId 的默认行为。它还说
仅当数据库支持此行为时才有效
然而,我在其他帖子中读到 ORMLite 4.25 (?) 和更新版本在 Android 设备上支持这种行为。所以,这也不完全正确。或者我正在做一些愚蠢的事情......任何人???
更新:考虑了一分钟后,我意识到allowGeneratedIdInsert 支持和继承都不是根本原因,因为我基于同一个抽象类实例化了其他对象。我无法弄清楚为什么一个特定的班级会导致这个问题。关于违规记录类型的唯一独特之处(与创建的其他类型相比)是一对多中的多,并且包含多对多。这些属性,加上allowGenereatedIdInsert,会是根本问题吗?相反,我应该问,有没有人在这种情况下看到过这个问题?
更新:别管这个问题。我可以使用updateId(...) 代替allowGeneratedIdInsert。
【问题讨论】:
-
听起来您已经解决了这个问题,但我仍然对原因感兴趣。您可以在某处发布 full 异常堆栈跟踪吗?也许pastebin.com
-
@Gray 一个月应该给你足够的时间:pastebin.com/Ebv77KHw
-
@Gray A > B C, A > D C。当 A、B、C 和 D 存在时发生异常,我将 B 的外部集合中的第一个引用添加到 C。
-
@Gray 当我说得如此抽象时,我自己都糊涂了。当我将 C 的外国集合中对 B 的第一个引用添加到 B 记录时......而不是相反。