核心数据错误是指反身多对多关系中不存在的核心数据属性

时间:2011-09-22 13:47:19

标签: iphone ios sqlite core-data many-to-many

我遇到了一个令人困惑的Core Data错误,我在尝试保存一些数据时收到以下错误消息:

CoreData: error: (1) I/O error for database at /var/mobile/Applications/5D3C0F3C-E097-43BF-887B-2870B1148226/Documents/Database.sqlite.  SQLite error code:1, 'table Z_1RELATEDCARDS has no column named FOK_REFLEXIVE'

Core Data: annotation: -executeRequest: encountered exception = I/O error for database at /var/mobile/Applications/5D3C0F3C-E097-43BF-887B-2870B1148226/Documents/Database.sqlite.  SQLite error code:1, 'table Z_1RELATEDCARDS has no column named FOK_REFLEXIVE' with userInfo = {

    NSFilePath = "/var/mobile/Applications/5D3C0F3C-E097-43BF-887B-2870B1148226/Documents/Database.sqlite";

    NSSQLiteErrorDomain = 1;

}

对于某些上下文:我的数据模型中没有列“反身”。我有一个实体,卡片,它有一个属性,relatedCards,这是卡片项目之间的多对多关系。我很困惑这个错误所指的是什么,并且非常感谢任何帮助。


更新

根据评论中的一个很好的建议,我在iOS模拟器中使用参数-com.apple.CoreData.SQLDebug 3运行应用程序并收到以下响应:

CoreData: annotation: Connecting to sqlite database file at "/Users/jason/Library/Application Support/iPhone Simulator/5.0/Applications/4EE6D378-A946-4EBF-9849-F7D2E58F2776/Documents/Database.sqlite"
CoreData: sql: pragma cache_size=200
CoreData: sql: BEGIN EXCLUSIVE
CoreData: sql: UPDATE ZCARD SET ZDATEMODIFIED = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: details: SQLite bind[0] = "338478797.092588"
CoreData: details: SQLite bind[1] = (int64)7
CoreData: details: SQLite bind[2] = (int64)119
CoreData: details: SQLite bind[3] = (int64)6
CoreData: sql: UPDATE ZCARD SET ZDATEMODIFIED = ?, Z_OPT = ?  WHERE Z_PK = ? AND Z_OPT = ?
CoreData: details: SQLite bind[0] = "338478797.092577"
CoreData: details: SQLite bind[1] = (int64)7
CoreData: details: SQLite bind[2] = (int64)100
CoreData: details: SQLite bind[3] = (int64)6
CoreData: sql: INSERT OR REPLACE INTO Z_1RELATEDCARDS(Z_1RELATEDCARDS, REFLEXIVE, FOK_REFLEXIVE) VALUES (119, 100, 0)
CoreData: annotation: Disconnecting from sqlite database due to an error.
CoreData: error: (1) I/O error for database at /Users/jason/Library/Application Support/iPhone Simulator/5.0/Applications/4EE6D378-A946-4EBF-9849-F7D2E58F2776/Documents/Database.sqlite.  SQLite error code:1, 'table Z_1RELATEDCARDS has no column named FOK_REFLEXIVE'
[Switching to process 45402 thread 0x15503]

对于一个小环境,我修改了Card表以跟踪它何时被修改。这就是调试输出上部的情况。但是,调试输出中的关键行显然是从底部开始的第四行:

CoreData: sql: INSERT OR REPLACE INTO Z_1RELATEDCARDS(Z_1RELATEDCARDS, REFLEXIVE, FOK_REFLEXIVE) VALUES (119, 100, 0)

我进入我的SQLite数据库并检查,此表中没有列FOK_REFLEXIVE。该表的架构是:

CREATE TABLE Z_1RELATEDCARDS ( Z_1RELATEDCARDS INTEGER, REFLEXIVE INTEGER, PRIMARY KEY (Z_1RELATEDCARDS, REFLEXIVE) );

很明显,Core Data正在尝试将数据插入到不存在的字段中。我该怎么办呢?

更新

这也是用户报告的问题。我无法更新我的应用程序,只是告诉用户“哦,你需要丢弃你的数据存储并重新开始。”不幸的是,即使这是造成这一错误的原因,也不会很好。

3 个答案:

答案 0 :(得分:3)

[更新: 根据作者对此答案的评论,这不是原因。该问题影响最终用途,他不修改sqlite文件。我会在这里留下这个答案,以备将来参考。 --TechZen

这里的reflex可能是SQL中的自反连接(也称为自连接).SQLDebug输出中的REFLEXIVE可能是创建连接表或类似构造的命令。在这种情况下,您的Card实体可能与自身有关系Core Data使用自反的SQL关系来保持该实体关系。

你这么说:

  

我修改了Card表以跟踪它的修改时间......

...我认为你直接修改了sqlite存储文件。这通常会导致问题,包括腐败。 Core Data使用未公开的专有sql架构。对它的任何更改甚至sqllite运行时都可能导致问题。

我认为最可能的问题是商店文件已损坏。您很少从Core Data objective-c代码中获取SQL错误,当您这样做时,它几乎总是与SQL无法运行的谓词相关。

重新启动数据库的干净版本,无需任何修改,看看它是否有效。

答案 1 :(得分:1)

我也遇到过这个问题。这对您和您的客户来说都是一个问题。如果您的应用程序在市场上更是如此。

核心数据在一个实体中包含多个多对多关系的方式似乎存在问题。看AT THIS POSTTHIS ONE AS WELL

第一个超链接中报告的解决方案无法解决我的问题。为了减轻影响,我创建了一个容器实体,允许我的多对多看起来像多对多。但是,如果我们的应用已经上市,您需要迁移以保留用户数据。

您似乎在开始时遇到异常。如果不是这种情况,请考虑内存过滤,如果您在谓词上失败,并且您没有在最多根实体上获得异常。

有时候这似乎只是一个问题。我有几个实体包含多个多对多关系。只有一个实体有这个问题。问题实体有两个多对多的关系,一对一的关系;所有这些都是可选的。一对一的删除规则是级联的,都是to-many的:nullify。

另一个不会导致此问题的实体有关系:

  • 1个一对多关系,可选,级联
  • 2对1关系,可选,级联
  • 3对多关系,可选,nullify

有什么区别?我不确定。我很想为这些多对多创建实体容器,以避免出现问题。

答案 2 :(得分:0)

我认为这是由于旧的.sqlite文件引起的问题,

您需要通过重置设备或模拟器来删除旧的。