【问题标题】:greendao DaoException Entity has no keygreendao DaoException 实体没有键
【发布时间】:2014-10-28 19:52:46
【问题描述】:

使用 GreenDao,我设法将我的数据库置于一个没有密钥的实体的状态。

我的问题是如何清除/删除此实体?我没有在 AbstractDao 中看到可以让我删除另一个列名的函数。

【问题讨论】:

  • 我怀疑您是否能够实际插入具有空主键的实体。您如何验证您插入的实体没有主键?请粘贴一些关于正在执行的代码和抛出的错误/异常的代码片段。
  • 您可以插入带有空主键的实体,但插入后会立即附加主键。要删除实体,您可以使用 DeleteQuery。
  • @yigit 感谢您澄清这一点。直接来自sqlite.orgIf an INSERT statement attempts to insert a NULL value into a rowid or integer primary key column, the system chooses an integer value to use as the rowid automatically.
  • 我只是在做一个标准的 GreenDao 插入,不多也不少。我是通过在带有大型列表视图的糟糕的旧低端 android 设备上进行测试时遇到这个错误的,并且插入和删除速度非常快。我使用事务插入/删除但仍然到达那里。我无法在更现代的 android 设备上重现错误,所以没有进一步调查 b/c 它是如此孤立,不幸的是还有太多其他紧迫的事情

标签: greendao


【解决方案1】:

您可以编写一个原始 SQL 查询来删除该行并使用您可以从可读的 DaoSession 中获取的 SQLiteDatabase 执行它。

DELETE FROM YourTable WHERE someColumn=?

如果你想避免拼写错误,你可以使用 greendao 的表格信息:

String query = "DELETE FROM " + YourDao.TABLENAME +
               " WHERE " + YourDao.Properties.SomeColumn.columnName + "=?";

更多信息:

根据您创建架构的方式,存在一些缺陷:

如果您使用AUTOINCREMENTNOT NULL 创建主键,greendao 将无法正确插入主键!

在分配自动增量主键时,主键将始终为0,从而导致在向表中插入第二行时违反约束。

因此,如果您不想处理 greendao-sourcecode,则不应使用notNull().primaryKey().autoincrement()

我对 greendao-core 做了一些小改动,以便能够使用上面的语句,但如果只使用 primaryKey().autoincrement(),一切应该都能正常工作。

【讨论】:

  • 仅供参考 - 在上面添加评论:我是如何到达那里的
【解决方案2】:

主键本身是唯一的,而不是 null,即使我明确提到它(不是 null().primaryKey()),它也应该可以完美地工作。我想指出,是我做错了还是greenDAO有问题。 greenDAO 是否有任何消息可以解决即将发布的版本中的问题。

我没有太多的声誉,否则我会在评论中问它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2014-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多