Consultar datos básicos para atributos específicos al crear nuevos objetos y devolver el objeto si existe, o crear uno nuevo si no existe.

Tengo un problema para verificar si un atributo particular de una Entidad existe en la Base de datos de datos básicos (a través de predicados) antes de crear un nuevo objeto; si el objeto existe, prefiero devolverlo antes que crear un nuevo objeto.

Tengo una aplicación simple que tiene una vista de tabla con un botón más en la barra de navegación; el usuario hace clic en eso y se presenta con un controlador de vista con 4 campos de texto. Completan esa información, presionan guardar y se guarda en Core Data y se muestra en TableView (mediante el uso de NSFetchedResultsControllers).

El modelo de datos es el siguiente:

Entidad de transacción con el atributo BOOL isReceived Entidad de la persona con atributo de cadena de nombre Ocasión Entidad con el atributo de cadena de título Elemento Entidad con el atributo de cadena de cantidad

La transacción tiene una relación con las entidades Persona (whoBy), Ocasión (Ocasión) y Artículo.

En el controlador de vista con el método de guardar, tengo el código siguiente que insertará nuevos objetos en la transacción, persona, entidades de ocasión, etc. Cada transacción es, por supuesto, única, pero con cada transacción, el usuario puede seleccionar una PERSONA existente y / o Ocasión y si esa persona no existe, se creará (de la misma manera).

Estoy un poco confundido en cuanto al formato del código aquí.

EDITAR: He intentado una combinación de código y simplemente no puedo hacer que esto funcione. En el código a continuación, estoy haciendo referencia a person.name en el predicado, pero también intenté crear una variable NSString local para mantener laself.nameTextField.text Código pero que no hizo nada. Intenté crear una propiedad NSString para hacer referencia a ella de esa manera y no funcionó. Intenté usar las palabrasMATCHES, LIKE, CONTAINS, == y cada combinación intermedia.

- (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];

}

Lógicamente, lo que quiero lograr es:

Cuando el usuario agrega una Transacción, verifique si es para una nueva persona o para una existente. Si es una existente, selecciónela de una lista de Personas (y cuando el usuario seleccione una persona, obtenga su NSManagedObjectID). Si es una nueva, créala en el lugar.

Lo mismo para la ocasión.

Establezca todos los otros campos del objeto Transacción (cantidad, etc.).

Mi pregunta es:

¿Qué predicado utilizo para que esto funcione?

Cuando pongo un punto de interrupción en este método, un NUEVO NOMBRE (uno que no existe antes) llama correctamente alelse if ([matches count] == 0) método y si creo una entrada con un nombre existente, llama al

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

Incluso con esta declaración, sigue creando un nuevo objeto de persona para el mismo nombre.

Implementaré correctamente la ocasión después de hacer que la persona trabaje, pero estoy perdido en cómo hacer que esto funcione.

Cualquier ayuda sería apreciada masivamente!

Respuestas a la pregunta(1)

Su respuesta a la pregunta