- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
此代码引发“CoreData: error: (19) PRIMARY KEY must be unique”错误。Day
实体只有一个 when
属性是 NSDate
,以及一个名为 tasks
的多对多关系.为什么会出现这个错误?如果 Day
已经存储了特定日期,我获取它,否则我插入它。所以,对于每一天的对象,应该有一个不同的 when
属性。我不确定这是否是主键。如何解决这个问题?先感谢您。
NSMutableSet *occurrences = nil;
occurrences = ...
NSMutableOrderedSet *newSet = [NSMutableOrderedSet orderedSetWithCapacity:[occurrences count]];
for(NSDate *current in occurrences) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// try to find a corresponding Day entity whose when attribute is equal to the current occurrence
// if none is available, create it
Day * day = [[self getDayForDate:current inManagedObjectContext:moc] retain];
if(!day){
day = (Day *) [NSEntityDescription insertNewObjectForEntityForName:@"Day" inManagedObjectContext:moc];
}
day.when = current;
[day addTasksObject:aTask];
[newSet addObject:day];
[moc insertObject:day];
[moc processPendingChanges];
[day release];
[pool release];
}
- (Day *)getDayForDate:(NSDate *)aDate inManagedObjectContext:(NSManagedObjectContext *)moc
{
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Day" inManagedObjectContext:moc];
[request setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(when == %@)", aDate];
[request setPredicate:predicate];
NSError *error = nil;
NSArray *array = [moc executeFetchRequest:request error:&error];
[request release];
Day *theDay = nil;
if(array && [array count] == 1){
theDay = [array objectAtIndex:0];
}
return theDay;
}
最佳答案
我最近一直在为 CoreData: error: (19) PRIMARY KEY must be unique
苦苦挣扎内部 iOS 应用程序出错,谢天谢地,经过一两天的研究和代码修改后发现了解决方案,我想在这里分享我的发现,希望它们能对其他人有所帮助。
一、一点背景
我们的内部应用程序最初从未使用任何代码构建以更新其 CoreData 存储 - 相反,对于需要在应用程序中显示新数据的每个应用程序构建迭代,CoreData SQLite 后备存储文件被简单地替换为一个新版本已经使用标准的基于桌面的 SQLite 编辑器进行了编辑——即原始 SQLite 文件根据需要进行了修改和更新。虽然人们认识到这种方法没有考虑到 CoreData 的“黑盒”性质,但在过去几年里,它实际上为我们的简单应用程序提供了很好的服务,并且应用程序很高兴地接受了更新的 SQLite 文件。新的应用程序构建。
然而,最近我们对应用程序进行了重大改革,从通过 Xcode 和应用程序重建更新应用程序 Assets 和数据的模型转变为通过 Web 服务获取新应用程序数据的模型,而正是在这个新的开发过程中PRIMARY KEY must be unique
的工作问题出现了。
折腾了好几天,想着一定是新的CoreData实体创建代码有问题(已经彻底检查再检查过)或者其他相关的问题,经过进一步研究,我发现我能够使用 Xcode 为我们的应用程序启用 CoreData SQL 调试(按照 this 非常有用的 SO 帖子中的说明)。
当我仔细研究 Xcode 中的 SQL 日志时,我可以看到在 CoreData 每次调用 INSERT
之前, SQLite 后备存储中的新记录,表明框架查询了 Z_PRIMARYKEY
具有以下查询的表 SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ?
哪里?
在幕后替换为相关的 Z_ENT
相关 CoreData 实体的值(通过查看 Z_ENT
表的内容,您可以看到每个 CoreData 实体的 Z_PRIMARYKEY
值)。这时我终于明白了 CoreData 的黑匣子里发生了什么!然后我在 Mac 上使用 Liya 应用程序仔细查看了我们应用程序的 SQLite 文件,并查看了 Z_PRIMARYKEY
的内容。表,果然是Z_MAX
列值都设置为 0
.当 CoreData 首次为我们的应用程序生成空的 SQLite 后备存储文件时,它们的初始值从未改变过!
我立即意识到出了什么问题,以及为什么 CoreData 报告了它原来的主键错误——它实际上与任何更高级别的 CoreData 实体对象的属性以最初怀疑的方式发生冲突无关,但确实是一个较低级别的错误。直到现在这个错误才具有绝对意义,它一直存在,只是没有在正确的上下文中被理解。
进一步研究表明,我们的内部团队在过去几年中成功地对 SQLite 后备存储进行了直接编辑,从各种实体表中插入、更新和删除记录,但我们的团队从未进行过任何更改到 Z_PRIMARYKEY
表,并且由于我们的应用程序以只读方式使用 CoreData 的方式,这从来都不是问题。
然而,现在我们的应用程序正在尝试创建 CoreData 条目并将其保存回 SQLite 后备存储,许多 INSERT
作为结果生成的查询只是失败了,因为 CoreData 无法获得正确的最大主键值,以便在任何给定表上生成下一个顺序主键,因此 INSERT
查询将失败,现在可以理解有意义的 PRIMARY KEY must be unique
错误!
解决错误
我意识到每个开发人员可能会以各种方式为他们的应用程序生成默认/初始 CoreData 内容,但是,如果您曾经在 CoreData 中遇到过这个特定的错误并且也很难立即找到明确的答案,我希望以下想法有帮助:
Z_PRIMARYKEY
中的相关记录。表,设置 Z_MAX
列值到当前最大值 Z_PK
相关实体表中的值。Employee
的 CoreData 实体。 , 在你的 CoreData 中ZEMPLOYEE
的表表示。 ——Z_PK
, Z_ENT
,Z_OPT
等,除了代表您的实体的列Z_PRIMARYKEY
中也会有相应的记录。带 Z_NAME
的 table Employee
的值- 因此,当您直接向 ZEMPLOYEE
添加新记录时表 - 确保在完成添加记录后,您遍历每个实体表并复制最大值 Z_PK
值到 Z_MAX
栏目Z_PRIMARYKEY
table 。您输入的值 Z_MAX
应该是最大的Z_PK
对应表中的值;不设置 Z_MAX
等于 Z_PK
的值+ 1,因为这不是 CoreData 所期望的! Z_PK
具有以下 SQL 的任何实体表的值:
"SELECT Z_PK FROM ZEMPLOYEE ORDER BY Z_PK DESC LIMIT 1"
Z_PK
ZEMPLOYEE
中任何记录的值表 - 显然你应该替换
ZEMPLOYEE
使用应用程序数据模型的相关表名称。
Z_PRIMARYKEY
的每条记录。表并用正确的
Z_MAX
更新它值(value)。完成此操作后,我就可以将此更新后的文件用作应用程序的持久存储支持文件。现在,当我插入并保存新的 CoreData 实体时,一切都按预期进行。
关于iphone - 为什么此代码会引发 "CoreData: error: (19) PRIMARY KEY must be unique"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12479232/
按照我目前安排代码的方式,下一行将为各种托管对象上下文运行。一些获取的实体将具有“complededDate”,而其他实体将没有“completedDate”属性。 let task = retrie
我在 import CoreData 的应用程序委托(delegate)中遇到此错误。据我所知,这是因为我将一个项目命名为 coreData。但是我更改了项目的名称,然后将其删除,并且删除了 /Lib
我想将记录保存在数组中并从 CoreData 中删除它们。我尝试过使用 NSCopying 但似乎 copyWithZone 不适用于 NSManagedObject。我真的很困惑,任何帮助将不胜感激
有时我的项目中很少会出现错误(比如每第 100 个请求)。我的一些 CoreData 的请求有 data:我无法使用该数据。我真的不明白为什么会发生这种情况以及如何防止这种行为。 错误数据输出示例:
如果您使用 Xcode 创建一个新项目并告诉它在您创建项目时创建一个 CoreData 模板,则您不需要 #import 在使用 ManagedObjects 的类中。 我已经将 Core Data
我对 SQLCipher 数据库加密和 CoreData 有疑问:当我将持久存储协调器与 SQLCipher 一起使用时,它总是在第一次应用程序重新启动后因一对多关系故障而崩溃。因此,当我第一次启动该
我有一个想要添加 iCloud 支持的应用程序。此应用程序从服务器加载数据,并将数据存储在 CoreData 中,以便 NSFetchedResultsController可以管理UITableVie
我正在从 coredata 表 STUDENT 中获取数据,并使用 Array 在 tableview 中显示所有学生姓名。在选择任何一个学生姓名后(点击 tableViewCell),它会从另一个表
我在构建过程中收到以下错误。 “API 滥用:尝试序列化非拥有协调器上的存储访问(PSC = 0x7fb5ae208890,存储 PSC = 0x0)CoreData 为什么我的应用程序会出现 Cor
当将 iOS 6.0.1 上的 Core Data 托管对象上下文保存到 SQLite 存储时,我遇到了一个奇怪的“CoreData 不支持持久的跨存储关系”异常。它涉及模型中 Quotes 和 Ab
我的应用程序有两个选项卡栏...每个选项卡栏都将用户带到一个向他显示项目列表的 TableView Controller 。第一个 View 允许用户在数据库中记录条目。另一个选项卡/ View 从数
Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具。Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据。这不仅可以节省
我有一个名为visitDate的coredata属性 我想使用单独的选择器相互独立地设置日期和时间。 我意识到,当我设置时间时,我需要获取visitDate的现有日期、月份和年份,但只从NSDateP
我有这个代码示例演示如何更新核心数据中的对象,但是我遇到了一个小问题: // Retrieve the context if (managedObjectContext == nil) { m
我在 CoreData 中有一个包含整数值的列。在从中检索结果时,我希望将列值减去一个数字。 类似于:columnValue - someNumber(此数字由用户输入) 我知道我可能必须为此使用 N
有没有办法将 CoreData 模型文件(即实体描述:*.xcdatamodeld)导出到另一个项目。因为重新创建所有实体很无聊:-) 最佳答案 是的,只需将模型文件本身添加/复制到新项目中,就像任何
我使用核心数据编写了 iPhone 应用程序。当我在模拟器中运行应用程序时,它崩溃并出现以下错误: 2010-02-12 17:24:22.359 CrData[46122:4503] Unresol
我是 CoreData 的新手,在我的 iPhone 应用程序中,我想知道如何保存一些文本,然后将其重新加载。但诀窍是,当 UIDatePicker 中的日期与我相同时加载它。像日历一样保存它。 更新
我正在寻找在 CoreData 中编写一些基本查询的方法,但文档中没有示例。以下是我的查询: 我有一个费用对象,它有一个费用金额字段。 费用可以链接到 ExpenseCategory 对象。 Expe
我在标题中使用“单例”一词时可能存在术语不正确的情况。我现在正在寻找一种好的技术。我有一个名为 user 的实体,它存储用户登录的数据,例如用于发出服务器请求的 session key 。我只希望这些
我是一名优秀的程序员,十分优秀!