Abfragen von Kerndaten nach bestimmten Attributen beim Erstellen neuer Objekte und Zurückgeben des Objekts, falls vorhanden, oder Erstellen eines neuen Objekts, falls nicht

Ich habe ein Problem beim Überprüfen, ob ein bestimmtes Attribut einer Entität in der Core Data Database (über Prädikate) vorhanden ist, bevor ein neues Objekt erstellt wird. Wenn das Objekt vorhanden ist, möchte ich es lieber zurückgeben, als ein neues Objekt zu erstellen.

Ich habe eine einfache App, die eine Tabellenansicht mit einem Plus-Button in der Navigationsleiste hat. Der Benutzer klickt darauf und erhält einen View Controller mit 4 Textfeldern. Sie geben diese Informationen ein, drücken auf Speichern und sie werden in Core Data gespeichert und in der TableView angezeigt (mithilfe von NSFetchedResultsControllers).

Das Datenmodell sieht wie folgt aus:

Transaktionsentität mit dem Attribut isReceived BOOL Personenentität mit dem Attribut name string Anlass Entität mit dem Attribut title string Element Entität mit dem Attribut amount string

Die Transaktion hat eine Beziehung zu den Entitäten Person (whoBy), Occasion (Occasion) und Item.

In der Ansichtssteuerung mit der Speichermethode habe ich den folgenden Code, mit dem neue Objekte in die Transaktion, Person, Anlassentitäten usw. eingefügt werden. Jede Transaktion ist natürlich einzigartig, aber bei jeder Transaktion kann der Benutzer eine vorhandene PERSON auswählen und / oder Anlass und wenn diese Person dann nicht existiert, wird sie erstellt (ebenfalls mit dem Anlass).

Ich bin etwas verwirrt über das Format des Codes hier.

EDIT: Ich habe eine Kombination von Code ausprobiert und kann das einfach nicht zum Laufen bringen. Im folgenden Code verweise ich auf person.name im Prädikat, habe jedoch auch versucht, eine lokale NSString-Variable zu erstellen, in der die Variable enthalten istself.nameTextField.text Code, aber das hat nichts getan. Ich habe versucht, eine NSString-Eigenschaft zu erstellen, um auf diese Weise zu verweisen, ohne dass dies funktioniert. Ich habe versucht, die Wörter zu verwendenMATCHES, LIKE, CONTAINS, == und jede Kombination dazwischen.

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

}

Logischerweise möchte ich Folgendes erreichen:

Wenn der Benutzer eine Transaktion hinzufügt, prüfen Sie, ob es sich um eine neue oder eine vorhandene Person handelt. Wenn es sich um eine vorhandene Person handelt, wählen Sie sie aus einer Personenliste aus. Wenn der Benutzer eine Person auswählt, erhalten Sie die NSManagedObjectID. Wenn es sich um ein neues handelt, erstellen Sie es vor Ort.

Das gleiche gilt für den Anlass.

Legen Sie alle anderen Felder des Transaktionsobjekts (Betrag usw.) fest.

Meine Frage ist:

Welches Prädikat verwende ich, um dies zum Laufen zu bringen?

Wenn ich einen Haltepunkt in diese Methode einfüge, ruft ein NEUER NAME (der vorher nicht existiert) den korrekt aufelse if ([matches count] == 0) Methode und wenn ich einen Eintrag mit einem vorhandenen Namen erstelle, ruft es die

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

Selbst mit dieser Anweisung wird immer noch ein neues Personenobjekt mit demselben Namen erstellt.

Ich werde den Anlass korrekt implementieren, nachdem ich die Person zum Arbeiten gebracht habe, aber ich bin einfach nicht sicher, wie ich das zum Arbeiten bringen kann.

Jede Hilfe wäre sehr dankbar!

Antworten auf die Frage(1)

Ihre Antwort auf die Frage