我遇到了一个令人困惑的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正在尝试将数据插入到不存在的字段中。我该怎么办呢?
这也是用户报告的问题。我无法更新我的应用程序,只是告诉用户“哦,你需要丢弃你的数据存储并重新开始。”不幸的是,即使这是造成这一错误的原因,也不会很好。
答案 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 POST和THIS ONE AS WELL。
第一个超链接中报告的解决方案无法解决我的问题。为了减轻影响,我创建了一个容器实体,允许我的多对多看起来像多对多。但是,如果我们的应用已经上市,您需要迁移以保留用户数据。
您似乎在开始时遇到异常。如果不是这种情况,请考虑内存过滤,如果您在谓词上失败,并且您没有在最多根实体上获得异常。
有时候这似乎只是一个问题。我有几个实体包含多个多对多关系。只有一个实体有这个问题。问题实体有两个多对多的关系,一对一的关系;所有这些都是可选的。一对一的删除规则是级联的,都是to-many的:nullify。
另一个不会导致此问题的实体有关系:
有什么区别?我不确定。我很想为这些多对多创建实体容器,以避免出现问题。
答案 2 :(得分:0)
我认为这是由于旧的.sqlite文件引起的问题,
您需要通过重置设备或模拟器来删除旧的。