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

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;

}

在某些情况下:我的数据模型中没有“自反”列。我有一个实体Cards,它有一个属性relatedCards,它是Card项之间的多对多关系。对于此错误指的是什么,我感到很困惑,我们将不胜感激。

更新

根据评论中的一个很好的建议,我使用参数-com.apple.CoreData.SQLDebug 3在iOS Simulator中运行了该应用程序,并收到以下响应:
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试图将数据插入到不存在的字段中。我应该怎么办?

更新:

这也是用户报告的问题。我无法更新我的应用程序,只能告诉用户“哦,您需要破坏您的数据存储并重新开始。”不幸的是,即使这是导致此错误的原因,也无法很好地解决这一问题。

最佳答案

[更新:基于作者对此答案的评论,这不是原因。该问题影响最终用途,他不会修改sqlite文件。我将在此处保留此答案,以供将来引用。 -TechZen ]

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

你这样说:



…我认为您直接修改了sqlite存储文件。这通常会引起问题,包括腐败。核心数据使用未记录的专有sql模式。对其进行任何更改,甚至sqllite运行时都可能导致问题。

我认为最可能的问题是存储文件已损坏。您很少会从Core Data Objective-C代码中获得SQL错误,而这样做时,错误几乎总是与无法运行SQL的谓词有关。

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

关于iphone - 核心数据错误是指自反多对多关系不存在的核心数据属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7515806/

10-14 22:33
查看更多