Запрос базовых данных для определенных атрибутов при создании новых объектов и возврат объекта, если он существует, или создание нового, если его нет

У меня проблема с проверкой того, существует ли конкретный атрибут сущности в Базовой базе данных (с помощью предикатов) перед созданием нового объекта; если объект существует, я лучше верну его, чем создаю новый объект.

У меня есть простое приложение, которое имеет табличное представление с кнопкой плюс на панели навигации; пользователь щелкает по нему, и ему предоставляется View Controller с 4 текстовыми полями. Они заполняют эту информацию, нажимают сохранить, и она сохраняется в Core Data и отображается в TableView (с помощью NSFetchedResultsControllers).

Модель данных выглядит следующим образом:

Entity Entity с атрибутом isReceived BOOL Person Entity с атрибутом строки имени Occasion Entity с атрибутом строки заголовка Item Entity с атрибутом суммы количества

Транзакция имеет отношение к сущностям Person (whoBy), Occasion (Occasion) и Item.

В контроллере представления с методом save у меня есть приведенный ниже код, который будет вставлять новые объекты в транзакцию, Person, Occasion Entities и т. Д. Каждая транзакция, конечно, уникальна, но с каждой транзакцией пользователь может выбрать существующего ЛИЦА и / или Случай, и если этот человек тогда не существует, он будет создан (аналогично случаю).

Я немного запутался в отношении формата кода здесь.

РЕДАКТИРОВАТЬ: я попробовал комбинацию кода и просто не могу заставить это работать. В приведенном ниже коде я ссылаюсь на person.name в предикате, но я также попытался создать локальную переменную NSString для храненияself.nameTextField.text код, но это ничего не сделало. Я попытался создать свойство NSString для ссылки на него таким образом, и это не сработало. Я пытался использовать словаMATCHES, LIKE, CONTAINS, == и каждая комбинация между ними.

- (IBAction)save:(id)sender
{
    NSManagedObjectContext *context = [self managedObjectContext];
    Transaction *transaction= [NSEntityDescription insertNewObjectForEntityForName:@"Transaction" inManagedObjectContext:context];
    Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
    Occasion *occasion = [NSEntityDescription insertNewObjectForEntityForName:@"Occasion" inManagedObjectContext:context];
    Item *amount = [NSEntityDescription insertNewObjectForEntityForName:@"item" inManagedObjectContext:context];

 NSFetchRequest *personFind = [NSFetchRequest fetchRequestWithEntityName:@"Person"];

    personFind.predicate = [NSPredicate predicateWithFormat:@"name == %@", person.name];
    // I have tried every combination of the predicate like MATCHES, LIKE. 
    // I created a local NSString variable and an NSString property
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    personFind.sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    NSError *error = nil;
    NSArray *matches = [context executeFetchRequest:personFind error:&error];

    if (!matches || ([matches count] > 1))
    {
        // Handle Error
    }
    else if ([matches count] == 0)
    {
        person.name = self.nameTextField.text;
        transaction.whoBy = person;
        occasion.title = self.occasionTextField.text;
        transaction.occasion = occasion;
    }

    else
    {
        person = [matches lastObject];
        transaction.whoBy = person; 
        occasion.title = self.occasionTextField.text
        transaction.occasion = occasion; 
    }


if (![context save:&error])
    {
        NSLog(@"Can't save! %@ %@", error, [error localizedDescription]);

    }
    [self dismissViewControllerAnimated:YES completion:nil];

}

Логично, что я хочу достичь:

Когда пользователь добавляет транзакцию, проверьте, является ли она новым человеком или существующим - если это существующая, выберите ее из списка людей (а когда пользователь выбирает человека, получите его NSManagedObjectID). Если это новый, создайте его на месте.

То же самое для случая.

Установите все остальные поля объекта Transaction (сумма и т. Д.).

Мой вопрос:

Какой предикат я использую, чтобы заставить это работать?

Когда я ставлю точку останова в этом методе, новое имя (которое раньше не существовало) правильно вызываетelse if ([matches count] == 0) метод, и если я создаю запись с существующим именем, он вызывает

else
        {
            person = [matches lastObject];
            transaction.whoBy = person; 
            occasion.title = self.occasionTextField.text
            transaction.occasion = occasion; 
        }

Даже с этим оператором, он все еще создает новый объект лица с тем же именем.

Я правильно выполнил этот случай после того, как заставил человека работать, но я просто потерял, как заставить это работать.

Любая помощь будет высоко ценится!

Ответы на вопрос(1)

Ваш ответ на вопрос