Iphone box“CoreData的性质以及SQLite记录不等同于CoreData实体,SQLite连接不等同于CoreData关系等事实

Iphone box“CoreData的性质以及SQLite记录不等同于CoreData实体,SQLite连接不等同于CoreData关系等事实,iphone,ios,ipad,core-data,Iphone,Ios,Ipad,Core Data,如果您的应用程序使用任何类型的预填充CoreData存储,并且如果您不是通过CoreData以任何方式填充SQLite备份存储的内容,请确保如果您确实在任何CoreData实体表中创建了新记录,您还应确保更新Z_PRIMARYKEY表,将Z_MAX列值设置为相关实体表中的当前最大Z_PK值 例如,如果在CoreData中有一个名为Employee的CoreData实体 SQLite持久存储备份文件这将由名为ZEMPLOYEE- 此表将包含一些“隐藏”核心数据列,包括Z_PK,Z_ENT, Z_O

如果您的应用程序使用任何类型的预填充CoreData存储,并且如果您不是通过CoreData以任何方式填充SQLite备份存储的内容,请确保如果您确实在任何CoreData实体表中创建了新记录,您还应确保更新
Z_PRIMARYKEY
表,将
Z_MAX
列值设置为相关实体表中的当前最大
Z_PK

例如,如果在CoreData中有一个名为
Employee
的CoreData实体 SQLite持久存储备份文件这将由名为
ZEMPLOYEE
- 此表将包含一些“隐藏”核心数据列,包括
Z_PK
Z_ENT
Z_OPT
等,以及表示实体 属性和关系。此实体表在
Z_PRIMARYKEY
表中也会有一条相应的记录,其
Z_NAME
值为
Employee
-因此,当您直接向
ZEMPLOYEE
表中添加新记录时,请确保在添加完记录后,检查每个实体表e并将最大值
Z_PK
复制到
Z_MAX
表的
Z_MAX
列中。您在
Z_MAX
中输入的值应该是相应表中最大的
Z_PK
值;不要将
Z_MAX
设置为等于
Z_PK
+1的值,因为这不是核心值ata正在期待

您可以使用以下SQL查询任何实体表的最大
Z_PK
值:

"SELECT Z_PK FROM ZEMPLOYEE ORDER BY Z_PK DESC LIMIT 1"
这将为
ZEMPLOYEE
表中的任何记录提供最大的
Z_PK
值-显然,您应该使用应用程序数据模型的相关表名替换
ZEMPLOYEE

对于我们的应用程序,我能够编写一个简单的命令行脚本,直接读取SQLite文件,遍历
Z_PRIMARYKEY
表的每条记录,并使用正确的
Z_MAX
值对其进行更新。一旦这样做,我就能够将更新后的文件用作应用程序的持久存储备份文件。现在,当我插入并保存新的CoreData实体,一切正常


现在,我们的应用程序可以通过web服务直接请求新数据,我们将完全不再手动编辑SQLite备份存储,而只使用CoreData框架来更新数据,但对于需要如此快速方便地输入数据的时代或其他应用程序,我希望这个答案可以帮助其他开发人员elopers,为他们节省我发现此解决方案所花费的时间和精力。

我想如果您已经有了新的一天,您就不需要插入新的一天(当
不是零时就是这种情况)。我特别指的是
[moc insertObject:day];
。为什么要这样做?如果使用
insertNewObjectForEntityForName
,则该方法在保存moc时为您插入对象。如果您需要修改它(您已检索到非零天),请修改它并保存。此外,当循环完成时(仅出于性能原因),我将执行
processPendingChanges
@Flex_Addicted,你是对的。现在Day对象被无条件插入。这可能是问题的根源。我将对此进行验证。但是,我无法在循环结束时保存,因为其他对象仍然存在,需要编辑。我将在第一条评论中告诉你。勘误表勘误表:为什么要使用它?然后,如果y您无法保存,请移动for循环末尾的
processPendingChanges
。祝您有愉快的一天。好的,它现在可以正常工作了。学到的教训:永远不要工作到深夜,现在看这个似乎很琐碎(但不是今天晚上)。如果您将您的评论改写为答案,我将很高兴接受。再次感谢您。如果您将Z_MAX设置为-1,那么在下一次插入表时,CoreData将1)根据已经存在的内容计算出下一个PK,并2)为您将Z_MAX更新为正确的值。就我而言,我使用的是SQLITE数据库浏览器2.0,它是Sqlite数据库的非常简单的查看器和编辑器。它非常简单但非常有效。多亏了@lanp。您的建议让我很快解决了这个问题。从您的角度来看,是否可以通过使用CoreData方法或其他方式,以编程方式将Z_MAX值更改为-1?我需要在运行时这样做,但我不知道如何做这一点。@Lisarien如果您使用CoreData API来管理数据,您不需要重置Z_MAX,如果苹果更改API,依赖它可能会有问题。我之前的答案是继承了一个没有有效使用CoreData的应用程序。由于CoreData本身没有提供操作Z_MAX的方法,因此您必须使用qlite3框架可以直接对CoreData sqlite数据库执行SQL查询。但是,我不建议将此作为长期策略,您需要小心确保在CoreData加载sqlite文件之前重置Z_MAX值。
"SELECT Z_PK FROM ZEMPLOYEE ORDER BY Z_PK DESC LIMIT 1"