Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 核心数据缺陷是指不存在自反多对多关系的核心数据属性_Iphone_Ios_Sqlite_Core Data_Many To Many - Fatal编程技术网

Iphone 核心数据缺陷是指不存在自反多对多关系的核心数据属性

Iphone 核心数据缺陷是指不存在自反多对多关系的核心数据属性,iphone,ios,sqlite,core-data,many-to-many,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_REFLEX

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

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,即卡片项目之间的多对多关系。我很困惑这个错误指的是什么,任何帮助都将不胜感激


更新

根据评论中的一个很好的建议,我在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_reflective
。此表的架构为:

CREATE TABLE Z_1RELATEDCARDS ( Z_1RELATEDCARDS INTEGER, REFLEXIVE INTEGER, PRIMARY KEY (Z_1RELATEDCARDS, REFLEXIVE) );
很明显,核心数据试图将数据插入到一个不存在的字段中。我该拿这个怎么办

更新: 这也是用户报告的一个问题。我无法更新我的应用程序,只能告诉用户“哦,好吧,你需要扔掉你的数据存储并重新开始。”不幸的是,即使这是导致此错误的原因,这种情况也不会得到很好的解决。

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

这里的反射可能是SQL中的反射连接(也称为自连接)SQLDebug输出中的
自反
可能是用于创建联接表或类似构造的命令。在这种情况下,您的卡实体可能与其自身存在关系。核心数据使用自反sql关系来保持该实体关系

你说:

我已经修改了卡片表以跟踪它何时被修改

…据我所知,您直接修改了sqlite存储文件。这通常会导致问题,包括损坏。核心数据使用未记录的专有sql架构。对它的任何更改,甚至sqllite运行时都可能导致问题

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


用干净的数据库版本重新开始,不做任何修补,看看它是否有效。

我认为这是由于旧的.sqlite文件造成的问题


您需要通过重置设备或模拟器来删除旧的应用程序。

我也遇到了这个问题。这是您和您的客户的问题。如果您的应用程序在市场上,情况会更糟

核心数据对包含在一个实体中的多对多关系使用别名的方式似乎存在问题

第一个超链接中报告的解决方案没有解决我的问题。为了缓解问题,我创建了一个容器实体,使我的多对多看起来像多对一对多。但是,如果我们的应用程序已经上市,您需要迁移以保留用户数据

看起来你在开始时就遇到了例外。如果不是这样的话,如果你在谓词上失败了,在内存过滤中考虑一下,而且你在你的根最基本的实体上也没有得到例外。

有时这似乎只是一个问题。我有几个实体包含多个多对多关系。只有一个实体存在此问题。问题实体有两个多对多关系和一对一关系;所有这些都是可选的。一对一删除规则是级联的,都是对多的:nullify

未导致此问题的另一个实体具有以下关系:

  • 1一对多关系,可选,级联
  • 2对1关系,可选,级联
  • 3多对多关系,可选,无效

有什么区别吗???我不确定。我试图为这些多对多创建实体容器,以避免您的问题。

您是否在任何时候更改了数据模型?尝试更改sql文件的名称,这将创建一个新的“数据库”。如果您的数据被破坏,这可能会有所帮助…-谁知道呢?我已经几个月没有更改数据模型了,而且这是一个客户报告的问题,我已经能够复制它。com.apple.CoreData.SQLDebug是您的朋友。使用-com.apple.CoreData.SQLDebug 3启动您的应用程序并重现该问题。将整个文本发布到此处或文件a雷达。这对ios有效吗?我如何将其作为一个参数添加?破坏数据存储并重新开始是否能解决问题?(甚至包括从头开始检查项目-有时,即使在清理和弄乱您之后,仍会留下与核心数据模型相关的文件)。虽然它不是一个有效的解决方案来部署到您的用户,但它将有助于诊断问题。+,我敢打赌macbook air就是这个原因,解决方案应该会解决它。我没有直接修改SQLite文件。它是对NSManagedObjsct实现的修改,在更新时更新lastModified属性。哦,顺便说一句唉,这也是用户报告的一个问题……我无法更新我的应用程序,只能告诉用户“哦,你需要扔掉你的数据存储,重新开始。”不幸的是,即使这是导致此错误的原因,这种情况也不会得到很好的解决。您是在迁移存储还是在迁移之后发生的?顺便说一句,它影响最终用户这一事实很重要。除非您告诉我们其他情况,否则每个人都会认为此问题只是在开发中出现,因为