2013-03-06 7 views
5

Ich habe versucht, Objekte in Core-Daten hinzuzufügen. Also, ich möchte, dass es doppelte Einträge im Core-Datenspeicher nicht zulassen sollte. Wie geht das? Dies ist mein Code zum Speichern von Daten.Gibt es eine Möglichkeit, doppelte Einträge in Kerndaten zu beschränken?

-(IBAction)save:(id)sender 
    { 

     if([name.text isEqualToString:@""] && [address.text isEqualToString:@""] && [phone.text isEqualToString:@""]) 
     { 

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Yo..!" 
                 message:@"Data Not Saved" 
                 delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
      [alert show]; 
     } 
    else 
    { 
     coreDataAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 

     NSManagedObjectContext *context = [appDelegate managedObjectContext]; 


     NSManagedObject *newContact; 
     newContact = [NSEntityDescription 
         insertNewObjectForEntityForName:@"Contacts" 
         inManagedObjectContext:context]; 


     [newContact setValue:name.text forKey:@"name"]; 
     [newContact setValue:address.text forKey:@"address"]; 
     [newContact setValue:phone.text forKey:@"phone"]; 


     name.text = @""; 
     address.text = @""; 
     phone.text = @""; 

     NSError *error; 
     [context save:&error]; 

     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Yo..!" 
                message:@"Data Saved" 
                delegate:nil 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
     [alert show]; 

     NSLog(@"Object Saved\n"); 

    } 


} 
+0

Während Sie speichern, überprüfen Sie, ob der Eintrag vorhanden ist oder nicht. Wenn vorhanden, nur aktualisieren. Wenn Sie keinen neuen Eintrag erstellen und dann in DB – Meera

Antwort

6

an Ihre Bedürfnisse anpassen können Da es keine Methode zur Verfügung gebaut ist, müssen Sie Ergebnisse holen und prüfen Sie, ob Sie dupliziert werden nicht wider Ergebnis enthält wollen.

Hier ist Code-Schnipsel:

-(void)checkForDuplicates 
{ 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Students" 
              inManagedObjectContext:managedObjectContext]; 

    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setEntity:entity]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"students" 
                   ascending:NO]; 
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor]; 

    [request setSortDescriptors:sortDescriptors]; 
    [sortDescriptor release]; 

    NSError *Fetcherror; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext 
             executeFetchRequest:request error:&Fetcherror] mutableCopy]; 

    if (!mutableFetchResults) { 
     // error handling code. 
    } 

    if ([[mutableFetchResults valueForKey:@"users"] 
     containsObject:name.text]) { 
     //notify duplicates 
     return; 
    } 
    else 
    { 
     //write your code to add data 
    } 
} 

Hope this Ihnen helfen können!

+0

Danke. :) Es war zwischen dieser schnellen Problemumgehung und der Verwendung von Prädikaten. –

+0

Wenn Sie jedes Mal neue Daten wünschen, löschen Sie einfach den Inhalt von der Entität und fügen Sie neue Daten ein. –

2

nein, coredata hat keine eingebaute in uniquing, da es keine DB ist.


Sie müssen die Eindeutigkeit in Ihrer Programmlogik sicherstellen.

z.B. oft führt man einen Abruf für einen Eintrag durch, der eindeutig sein sollte, und wenn dieser Abruf 1 Eintrag enthält, fügen Sie keinen weiteren hinzu, sonst fügen Sie ihn hinzu!

==> das funktioniert gut für die seriellen CD-Anschluss, kann aber mit mehreren Kontexten erhalten kompliziert, die

1

In Core Data es in einem multithreaded env laufen ist nicht so etwas wie doppelte Einträge, mindestens so weit wie Kern Daten sind betroffen. Nicht in dem Sinne, dass man es aus der Sicht einer Datenbank betrachtet. Was sinnvoll ist, da Core Data keine Datenbank ist, ist es ein Objekt Graph Management System.

Um Duplikate zu vermeiden, müssen Sie zunächst eine Suche durchführen. Wenn die Suche NULL nur dann zurückgibt, speichern Sie sie, sonst tun Sie nichts.

This article gibt Ihnen, den Sie

+0

speichern, vielen Dank für Ihre Vorschläge. –

+0

@ShailendraKrGangwar glücklich zu helfen! Bitte upvote oder markieren Sie als akzeptierte Antwort, wenn eine Antwort Ihnen geholfen hat ... –

+0

@Srikar, dieser Link ist down. Ich könnte diesen Artikel auch verwenden. Hast du eine andere Quelle dafür? Vielen Dank! –

1

Ich denke, der beste Ansatz wäre, die Methode countForFetchRequest mit einem Prädikat aufrufen, um zu bewerten, ob Ihr Geschäft ein passendes Objekt hat. Da diese Art von Anfrage keine Objekte zurückzieht, sollte sie leistungsfähiger sein als andere Lösungen. Hier ist eine Swift 2.0-Implementierung, die zu einer NSManagedObject-Unterklasse hinzugefügt wurde.

func tokenExists (aToken:String) -> Bool { 
     let request: NSFetchRequest = NSFetchRequest(entityName: self.className!) 

     let predicate = NSPredicate(format: "token == %@", argumentArray: [aToken]) 

     request.predicate = predicate 

     let error: NSErrorPointer = nil 

     let count = self.managedObjectContext!.countForFetchRequest(request, error: error) 

     if count == NSNotFound { 
      return false 
     } 
     return true 
    } 

NB - (One keine Gleichheit Kriterien ersetzen könnten Sie für das Prädikat mögen, aber denken Sie daran, dass dann möglich, wenn Sie einen numerischen Bezeichner verwenden sollten, wenn eine verfügbar ~ für die beste Leistung ist)

Usage:

Man könnte dann während des Einsetzens der obigen Funktion verwenden:

func insertToken (value:String) { 

     if !tokenExists(value) { 
      self.token = value 
      saveState() 
     } 

    } 
0

Lassen Sie mich den besten Ansatz von Apple Beispielcode selbst setzen. Bitte beachten Sie den Beispielcode "ThreadedCoreData" für weitere Informationen.

https://developer.apple.com/library/content/samplecode/ThreadedCoreData/Introduction/Intro.html

// before adding the earthquake, first check if there's a duplicate in the backing store 
    NSError *error = nil; 
    Earthquake *earthquake = nil; 
    for (earthquake in earthquakes) { 
     fetchRequest.predicate = [NSPredicate predicateWithFormat:@"location = %@ AND date = %@", earthquake.location, earthquake.date]; 

     NSArray *fetchedItems = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error]; 
     if (fetchedItems.count == 0) { 
      // we found no duplicate earthquakes, so insert this new one 
      [self.managedObjectContext insertObject:earthquake]; 
     } 
    } 
+0

Dies funktioniert nicht in Umgebungen mit mehreren Threads –

Verwandte Themen