1

我有这段代码,它从一个单元格中获取 id 和 name.. 然后当我选择一行时,我必须保存这个选择并将其发送到 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];
4

3 回答 3

7

泰达内,

当您需要检查一个对象是否已经存在时,您需要设置一个获取请求并使用特定的谓词。在你的情况下,你可以简单地获取反对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];

希望有帮助。

于 2012-06-14T13:08:58.263 回答
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
}

此结果数组将显示该条目是否存在。如果您有任何疑问,请告诉我。祝您编码愉快!

于 2012-06-14T11:35:28.947 回答
0

您最好的选择可能是为其创建一个 City 类和一个类方法,例如:

+ (City *)cityWithUniqueName:(NSString *)name;

在那里,您将查找具有名称的现有核心数据对象并将其返回。如果没有找到,使用创建一个insertNewObjectForEntityForName并返回它。

于 2012-06-14T11:37:57.917 回答