核心数据 - 插入新对象,检查是否存在相同的对象,处理返回

时间:2011-12-14 22:21:34

标签: validation core-data object

我正在使用Core Data并获得两个实体(帐户,联系人),其中一个帐户可以有多个联系人(一对多关系)。

插入新对象时,我想检查新联系人的电话号码是否属于现有联系人。如果该号码存在,则应该有用户通知。

在“ContactAddViewController.m”中调用以下方法,其中contactData是NSMutableDictionary,其中包含新联系人的值和键(在文本字段中输入)。

[ContactInfo findOrCreateContact:contactData inManagedObjectContext:context];

在“AccountInfo.m”中,设置具有谓词和我的文本字段值的电话请求。如果电话号码不存在,联系人将被添加到实体“ContactInfo” - 如果存在,则该方法返回0.

+ (ContactInfo *)findOrCreateContact:(NSDictionary *)data inManagedObjectContext:(NSManagedObjectContext *)context
{
    ContactInfo *contactInfo = nil;

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    request.entity = [NSEntityDescription entityForName:@"ContactInfo" inManagedObjectContext:context];
    request.predicate = [NSPredicate predicateWithFormat:@"phone == %@", [data objectForKey:@"phone"]];

    NSError *error = nil;
    contactInfo = [[context executeFetchRequest:request error:&error] lastObject];

    if (!error && !contactInfo) 
    {
        // if phone number can't be found, create new contact
        contactInfo = [NSEntityDescription insertNewObjectForEntityForName:@"ContactInfo" inManagedObjectContext:context];
        contactInfo.firstName = [data objectForKey:@"firstName"];
        contactInfo.lastName = [data objectForKey:@"lastName"];
        contactInfo.phone = [data objectForKey:@"phone"];
        contactInfo.updatedDate = [NSDate date];
        contactInfo.cinfoTOainfo = [AccountInfo findOrCreateAccount:data inManagedObjectContext:context];
    }

    // Return object
    return contactInfo;
}

__

问题

如何将返回值0设置为NSString(或者像那样),以便我可以构建如下的if子句?

if ( ... ) // What should I put in here?
{
    // if phone number doesn't exist, do that.
}
else
{
    // if phone number exist, do that.
}

1 个答案:

答案 0 :(得分:4)

你的意思是该方法的返回值?

+ (ContactInfo *)findOrCreateContact:(NSDictionary *)data inManagedObjectContext:(NSManagedObjectContext *)context

首先命名函数状态find OR create所以使用这样的名称,你应该返回一个对象,你找到的对象或刚刚创建的对象。这样可以避免可能的混淆。

其次,您的返回类型是一个对象,因此您应该返回nil或一个对象。

所以在这一点上你必须决定是否要遵守你的命名,但是你想说的是你想要的。
你可以有这样的方法:

+ (ContactInfo *)findOrCreateContact:(NSDictionary *)data 
              inManagedObjectContext:(NSManagedObjectContext *)context
                   contactWasCreated:(BOOL *)isNew

通过将指针传递给BOOL,如果创建了ContactInfo,则可以将其设置为YES;如果返回已存在的那个,则可以将其设置为NO,如果您无法使用ContactInfo,则仍然可以返回nil回来。将BOOL作为指针传递的灵感来自于- (BOOL)save:(NSError **)error,您在其中传递指向对象的指针,如果需要,可以检索NSError。
所以,如果你能说,

if (contanctInfo && wasCreated)
{
    // I've got a new one
}
else if (contactInfo) 
{
     // I just receive an old one
}
else
{
     // something very bad just happened...
}

您还可以决定返回一个NSDictionary,其中ContactInfo为一个条目,而一个NSNumber为BOOL作为另一个条目。