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

标签 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.
}

最佳答案

你是说那个方法的返回值?

+ (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/

相关文章:

c++ - 从用户那里获取 "yyyy/mm/dd, hh:mm"形式的日期输入并在 C++ 中验证日期?

javascript - 如何遍历对象并创建树对象

javascript - 在 Rails 助手中使用 Javascript 调用验证文本字段时,如何返回最后一个有效输入?

jQuery Validation - 覆盖核心验证方法

iOS 核心数据搜索速度提升

ios - 创建新的核心数据模型

swift - 如何在 NSManagedObject Swift 扩展中创建托管对象子类的实例?

javascript - 带有方法的 JS 对象文字缺少什么?

c# - 为什么不能将 null 分配给 C# 中的对象?

validation - 一种基于Result <_,E1>和Result <T,E2>来获取Result <T,E>的好方法吗?