2012-06-14 55 views
1

我有这个代码,它从一个单元格获取ID和名称..然后,当我选择一个行,我必须保存这个选择并将其发送到核心数据...但是例如:如果我已经有一个城市一个重复的名称..我如何停止添加它?如何检查核心数据是否已具有值?

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]; 

回答

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米尔斯是说,你可以使用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]; 

希望有所帮助。

+0

非常感谢你...我终于明白了:) – Tidane

+0

@Tidane不客气。干杯。 –

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 
} 

此结果数组将显示该条目是否存在。让我知道如果你有任何疑问......快乐的编码!

+0

它创建它..但它增加了空行......我不明白它:S – Tidane

+0

只有在数组数为零时才添加条目的代码。 –

0

您最好的选择可能是创建一个城市类和它这样一个类的方法:

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

在那里,你会查找与名称的现有核心数据对象,并将其返回。如果找不到,请使用insertNewObjectForEntityForName创建一个并返回。

+0

我可以想象那..但我真的失去了......创建一个类与IDV和名称的城市..之后,我使所有的获取? – Tidane

相关问题