我正在使用 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.
}
最佳答案
你是说那个方法的返回值?
+ (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 作为一个条目,而 BOOL 的 NSNumber 作为另一个条目。
关于validation - 核心数据 - 插入新对象,检查是否存在相同的对象,处理返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8512551/