我有这个代码从一个单元格中获取id和名称..然后当我选择一行时,我必须保存此选项并将其发送到Core Data ...但是例如:如果我已经有一个城市有一个重复的名称..我怎么能停止添加它?
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *context = [appDelegate managedObjectContext];
NSManagedObject *villesR = [NSEntityDescription
insertNewObjectForEntityForName:@"Ville"
inManagedObjectContext:context];
[villesR setValue:idVille forKey:@"idV"];
[villesR setValue:nomville forKey:@"nom"];
[self.navigationController pushViewController:detailView animated:YES];
答案 0 :(得分:7)
Tidane,
当您需要检查对象是否已经存在时,您需要设置获取请求并使用特定谓词。在您的情况下,您可以对Ville
进行简单的抓取,看看您是否已经idV
。我认为idV
就像是Ville
的标识符。检查nom
可能相同,但您可以在世界上两个不同的地方使用两个cities
同名。
@alpz 解决方案没问题。此外,您还可以将fecth限制设置为1:
[request setFetchLimit:1];
否则你可以简单地做
NSUInteger count = [context countForFetchRequest:request error:&error];
if(count == 0) {
// add the new city here
}
而不是
NSArray *results = [context executeFetchRequest:request error:nil];
@Phillip Mills 表示您可以使用NSManagedObject
子类,而不是使用键值编码访问。我认为使用类的属性而不是普通的字符串键更容易。
因此,一旦创建了Ville
子类(organising-core-data-for-ios),就可以为其创建一个名为Ville+Extension
的类别,并创建如下方法:
+ (Ville *)villeWithUniqueName:(NSString *)name withManagedObjectContext:(NSManagedObjectContext*)context
{
NSFetchRequest * request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Ville" inManagedObjectContext:context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"nom = %@", name];
[request setFetchLimit:1];
NSArray *results = [context executeFetchRequest:request error:nil];
Ville* theVille = nil;
if ([results count] == 0)
{
theVille = // create the new here
}
else
{
theVille = (Ville*)[results objectAtIndex:0];
}
[request release]; // if you don't use ARC
return theVille;
}
然后,使用该类别(导入后),如:
Ville* theVille = [Ville villeWithUniqueName:@"yourName" withManagedObjectContext:yourContext];
希望有所帮助。
答案 1 :(得分:1)
在保存之前,您必须检查核心数据是否存在。这就是我处理同样情况的方式。
NSFetchRequest * request = [[NSFetchRequest alloc] init];
NSManagedObjectContext* context=[Server serverInfo].context;
[request setEntity:[NSEntityDescription entityForName:@"Coupon" inManagedObjectContext:context]];
[request setPredicate:[NSPredicate predicateWithFormat:@"Upc=%@",[[ar objectAtIndex:i]valueForKey:@"upc_code"]]];
NSArray *results = [context executeFetchRequest:request error:nil];
[request release];
if ([results count] == 0)
{
//core data does not have an entry with the upc code(in my case) that i am searching
}
else
{
// core data have already an entry with that upc code
}
此结果数组将显示该条目是否存在。如果您有任何疑问,请告诉我..编码!
答案 2 :(得分:0)
您最好的选择可能是创建一个City类和一个类方法,例如:
+ (City *)cityWithUniqueName:(NSString *)name;
在那里,您将使用名称查找现有核心数据对象并将其返回。如果找不到,请使用insertNewObjectForEntityForName
创建一个并返回。