Ich habe ein NSSet von Büchern, die in einer Viele-zu-Eins-Beziehung zu einem Autorenobjekt in Kerndaten stehen.IOS/Objective-C/CoreData: Objekt aus NSSet löschen
Es gibt eine Ansicht, in der der Benutzer diese bearbeiten kann, einschließlich der leeren Felder. Der Benutzer kann auch neue hinzufügen. Dies führt zu einer Situation, in:
1) wir die gleiche Anzahl von Büchern am Ende, bearbeiten nur 2) wir mit weniger Büchern am Ende, was bedeutet, einige aus dem NSSet gelöscht werden sollen 3) wir mit am Ende mehr Bücher, was bedeutet, dass einige zum NSSet hinzugefügt werden sollten.
Mein ursprünglicher Ansatz bestand darin, die Elemente in ein NSMutableArray zu konvertieren, Änderungen im muablearray vorzunehmen, zurück in ein NSSet zu konvertieren und das NSSet mit dem Objekt in Beziehung zu setzen.
Während dies im Objektdiagramm der Kerndaten funktioniert, scheint es jedoch nicht die tatsächlichen zugrunde liegenden Objekte im persistenten Speicher zu löschen.
Da NSSet keinen Index enthält, kann ich alternativ keine Möglichkeit zum Löschen eines bestimmten Objekts im NSSet identifizieren.
Der folgende Code ändert die Namen der Bücher unter der Annahme, dass sich die Anzahl der Bücher nicht ändert. Wenn jedoch die Anzahl der Bücher nach der Bearbeitung weniger ist, löscht das fehlende Buch nicht den persistenten Speicher. Es ändert nur die zugehörigen Objekte im Objektdiagramm der Kerndaten. Dies führt zu Problemen, wenn ich den persistenten Speicher mit einem Server synchronisiere.
Also im Grunde suchen nach Weg, ein Element in einem NSSet in Abwesenheit eines Index zu identifizieren und zu löschen. Danke für Anregungen.
NSSet *booksForAuthor = _author.books;
NSMutableArray *theBooks = [[booksForAuthor allObjects] mutableCopy];
NSSortDescriptor *sortDescriptor= [[NSSortDescriptor alloc] initWithKey:@"bid"
ascending:YES];
NSArray *booksArray = [theBooks sortedArrayUsingDescriptors:@[sortDescriptor]];
_numStartingBooks = [booksArray count];
_booksOnLoad = booksArray; //Now have an array of books before edit
NSMutableArray <NSString*> *bookNames=[NSMutableArray arrayWithCapacity:20];
//now collect new set of books from user into array (code omitted)
[bookNames removeObject:@""];//remove any blanks
_numBooks = [bookNames count];//number of books after edit
int i;
for (i = 0; i < _numStartingBooks; i++) {
[theNewBooks addObject:_booksOnLoad[i]];
theNewBooks[i].name = bookNames[i];
}
NSSet *theBookSet = [NSSet setWithArray:theNewBooks];
_author.books = theBookSet;
An dieser Stelle haben wir die NSSet auf die neue Anzahl der Bücher festgelegt, sondern von dem, was ich sagen kann, nicht die zugrunde liegenden zusätzlichen verwalteten Objekte, die am Anfang gelöscht.