如何检查核心数据是否已有值?

时间:2012-06-14 11:16:42

标签: iphone ios xcode core-data

我有这个代码从一个单元格中获取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];

3 个答案:

答案 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创建一个并返回。