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

Jas*_*son 7 sqlite iphone many-to-many core-data ios

我遇到了一个令人困惑的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;

}
Run Code Online (Sandbox Code Playgroud)

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


UPDATE

根据评论中的一个很好的建议,我使用参数在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]
Run Code Online (Sandbox Code Playgroud)

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

CoreData: sql: INSERT OR REPLACE INTO Z_1RELATEDCARDS(Z_1RELATEDCARDS, REFLEXIVE, FOK_REFLEXIVE) VALUES (119, 100, 0)
Run Code Online (Sandbox Code Playgroud)

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

CREATE TABLE Z_1RELATEDCARDS ( Z_1RELATEDCARDS INTEGER, REFLEXIVE INTEGER, PRIMARY KEY (Z_1RELATEDCARDS, REFLEXIVE) );
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

Tec*_*Zen 3

[更新: 根据作者对此答案的评论,这不是原因。该问题影响最终使用,并且他没有修改 sqlite 文件。我将把这个答案留在这里仅供将来参考。--TechZen ]

\n\n

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

\n\n

你说:

\n\n
\n

我修改了卡表以跟踪其修改时间\xe2\x80\xa6

\n
\n\n

\xe2\x80\xa6 从中我认为您已经直接修改了 sqlite 存储文件。这通常会导致问题,包括腐败。Core Data 使用未记录的专有 SQL 模式。对它甚至 sqllite 运行时的任何更改都可能导致问题。

\n\n

我认为最可能的问题是存储文件已损坏。您很少会从 Core Data Objective-C 代码中遇到 SQL 错误,即使出现这种错误,也几乎总是与 SQL 无法运行的谓词有关。

\n\n

从数据库的干净版本开始,无需任何修改,看看它是否有效。

\n