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正在尝试将数据插入到不存在的字段中.我应该怎么做呢?
这也是用户报告的问题.我无法更新我的应用程序,只是告诉用户"哦,你需要丢弃你的数据存储并重新开始." 不幸的是,即使这是导致此错误的原因,也不会很好.
[更新: 根据作者对此答案的评论,这不是原因。该问题影响最终使用,并且他没有修改 sqlite 文件。我将把这个答案留在这里仅供将来参考。--TechZen ]
\n\n这里reflex可能是 SQL 中的自反连接(也称为自连接)。REFLEXIVE。SQLDebug 输出中的可能是创建连接表或类似构造的命令。在这种情况下,您的 Card 实体可能与其自身有关系,Core Data 使用自反 SQL 关系来保存该实体关系。
你说:
\n\n\n\n\n我修改了卡表以跟踪其修改时间\xe2\x80\xa6
\n
\xe2\x80\xa6 从中我认为您已经直接修改了 sqlite 存储文件。这通常会导致问题,包括腐败。Core Data 使用未记录的专有 SQL 模式。对它甚至 sqllite 运行时的任何更改都可能导致问题。
\n\n我认为最可能的问题是存储文件已损坏。您很少会从 Core Data Objective-C 代码中遇到 SQL 错误,即使出现这种错误,也几乎总是与 SQL 无法运行的谓词有关。
\n\n从数据库的干净版本开始,无需任何修改,看看它是否有效。
\n