1

我的目标是 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> { ... }

我无法从allowGeneratedIdInsertand的文档中解释这一点generatedId。实际上 alloeGeneratedIdInsert 的文档说它覆盖了 generatedId 的默认行为。它还说

这仅在数据库支持此行为时才有效

然而,我在其他帖子中读到 ORMLite 4.25 (?) 和更新版本在 Android 设备上支持这种行为。所以,这也不完全正确。或者我在做一些愚蠢的事情......任何人???

更新:考虑了一分钟后,我意识到allowGeneratedIdInsert支持和继承都不是根本原因,因为我基于同一个抽象类实例化了其他对象。我无法弄清楚为什么一个特定的班级会导致这个问题。关于违规记录类型的唯一独特之处(与创建的其他类型相比)是一对多中的多,并且包含多对多。这些属性与 结合起来allowGenereatedIdInsert会是根本问题吗?相反,我应该问,有没有人在这种情况下看到这个问题?

更新:没关系这个问题。我可以使用updateId(...)而不是allowGeneratedIdInsert.

4

2 回答 2

3

所以我不确定这一点,但在我看来,您正试图将一个元素两次插入到具有相同 UUID id 的表中。例外是说存在约束失败:

IllegalStateException: Could not create data element in dao
    at BaseForeignCollection.add(BaseForeignCollection.java:57)
...
Caused by: SQLiteConstraintException: error code 19: constraint failed

如果你称它为-foreignCollection.add(...);做同样的事情dao.create(...);,你不能用同一个对象做这两个。如果您有一个已由 DAO 创建的现有对象,并且您希望将其与另一个对象关联,您应该执行以下操作:

   // associate this object with another
   existingObject.setForeignField(...);
   // now update it in the db
   existingObjectDao.update(existingObject);

您不能将其添加到 foreignField 的外部集合中。

于 2013-02-02T20:03:16.913 回答
1

我有一个类似的问题。但它是由使用 create 而不是 createOrUpdate 来保存对象引起的。

在更改此设置之前卸载应用程序也很重要,以确保数据库已被删除并且不会保留旧行为。

Edit: createOrUpdate is very time expensive. It's better use just create with great amounts of data.

Edit 2:It is also bether to use a TransactionManager.callInTransaction.

于 2013-09-11T21:45:13.310 回答