iphone - 核心数据错误是指自反多对多关系的核心数据属性不存在

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

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

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 模拟器中运行该应用程序并收到以下响应:

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 试图将数据插入到一个不存在的字段中。我该怎么办?

更新:

这也是用户反射(reflect)的问题。我无法更新我的应用程序,只能告诉用户“哦,好吧,你需要清理你的数据存储并重新开始。”不幸的是,即使它是导致此错误的原因,也不会很好。

最佳答案

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

这里的reflex大概是SQL中的reflexive join(也叫self join)。SQLDebug输出的REFLEXIVE大概是创建join表的命令或类似的结构。在这种情况下,您的 Card 实体可能与其自身有关系 Core Data 使用自反 sql 关系来保持该实体关系。

你说:

I have modified the Card table to keep track of when it is modified…

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

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

从不进行任何修改的干净版本的数据库重新开始,看看它是否有效。

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

相关文章:

iphone - 如何禁用 UITextField 中的字母字符?

node.js - 使用 Electron 项目(和更好的 sqlite3)将未定义的 nodejs 处理为 bindings.js

angularjs - AngularJS ionic从Sqlite删除选定的图像

android - 如何从 Android 设备下载 SQLite 数据库?

iphone - 以 Unity3D 作为子项目的 Xcode 工作区?

iphone - 使用 uitabbarcontroller 动画 View 更改

iphone - IOS6 怎样听界面方向。不是设备方向

ios - Google 的 GMSAutocompleteTableDataSourceDelegate API 部分适用于 iOS

ios - TableView 行上的开关更改会影响其他行

ios - 如何链接淡入淡出动画