3 Stimmen

Core Data (Mac) Wie implementiert man die automatische Erhöhung eines ID-Feldes?

Ich habe mich gefragt, ob mir jemand einen Tipp geben kann, wie man die automatische Erhöhung eines Attributs in einer Coredata-Entität einrichten kann. Ich weiß, dass das Kontrollkästchen "Indiziert" das Feld für die Suche und die Nachschlagegeschwindigkeit indiziert macht.

Ich weiß auch, dass ich dies im Code tun müssen, aber ich bin mir nicht sicher, wie man die letzte/höchste ID zu erhalten, um die neue Objekte-ID zu setzen. Ich fand, wie dies vor Jahren zu tun, aber kann es nicht wieder finden.

Ich habe sehr begrenzte Kenntnisse in Objective-C und noch mehr in Coredata. Auch wenn jemand vorschlagen könnte, wie man sicherstellt, dass ein Feld eindeutig ist, wie z. B. das Namensfeld, wäre das großartig.

Mein Code lautet aquí wenn Sie sich ansehen wollen, was ich bisher gemacht habe. Das Projekt ist eine grundlegende Datenbank, die Teile und deren Standorte sowie Werkzeuge enthält. Es ist nur teilweise fertig, im Grunde eine kleine Datenbank für meine Person Elektronik-Kit. Ich bin mir sicher, dass es Anwendungen gibt, die dies tun, aber es ist immer besser, wenn man es selbst macht.

0 Stimmen

Was ich dachte, ich habe eine Klasse für Entität so sagen Standort, wenn wenn die neue Schaltfläche angeklickt wird mein Code bekommt die höchste Id aus der Standorttabelle und legt diesen Wert in das Feld id in der Tabelle.

0 Stimmen

Wozu brauchen Sie ein automatisch inkrementierendes id-Feld? In CoreData ist es im Allgemeinen unnötig. Wenn Sie einen eindeutigen Bezeichner benötigen, verwenden Sie die objectID Eigentum. Wenn Sie eine Beziehung benötigen, richten Sie diese explizit in CoreData ein.

1voto

Rich Punkte 1082

Ich bin mir nicht ganz sicher, was die id in Ihrer Anwendung macht, aber meine erste Beobachtung ist, dass alle Entitäten in Ihrem Datenmodell sowohl einen Namen als auch eine id haben, also sollten sie wahrscheinlich eine abstrakte Superentität haben, die Name und id enthält. Abgesehen davon können Sie die maximale id in einem Satz wie diesem abrufen:

Category *cat = /* get a category  */;
NSSet *parts = cat.parts;
NSNumber *maxID = [parts valueForKeyPath:@"@max.id"];

für die IDs einer Kategorie könnten Sie eine Abrufanfrage für alle Kategorien durchführen und dann diese Technik auf das zurückgegebene Array anwenden. Ich weiß nicht, ob Sie die IDs jedes Modellobjekts eindeutig halten möchten oder ob Sie möchten, dass die IDs für das erste Objekt, das zu jeder Entität hinzugefügt wird, mit 0 beginnen.

Um sicherzustellen, dass ein Feld eindeutig ist, können Sie die Validierung von verwalteten Objekten verwenden. Dies wird im Core Data Programming Guide und ausführlicher im Model Object Implementation Guide beschrieben. Um sicherzustellen, dass ein Name eindeutig ist, müssten Sie ihn mit allen Namen in einer validateName:error:-Methode vergleichen. Wenn Sie eine abstrakte Superentität erstellen, ist dies viel einfacher. Dazu holt man sich alle Namen von Objekten in der abstrakten Superentität und testet sie gegen den zu validierenden Wert.

Bearbeiten: Wenn Sie die abstrakte Superentität verwenden, dann sollten Sie die maximale ID der Objekte in der abstrakten Superentität erhalten, wenn Sie sie eindeutig sein wollen. Auch als jemand anderes wies darauf hin, die objectID eines verwalteten Objekts ist eine eindeutige Kennung für sie, die immer gleich sein wird, aber wenn ich mir die App ansehe, glaube ich nicht, dass das wirklich das ist, was Sie wollen, weil sie Computer-Nummern statt die freundlicheren Ergebnisse der Inkrementierung der höchsten bekannten id, wenn ein neues Objekt erstellt wird. Außerdem sollten Sie die Objekt-ID in awakeFromInsert so einstellen, dass sie nur aufgerufen wird, wenn das Objekt erstellt wird.

0 Stimmen

Das ID-Feld ist die Nummer, die ich im wirklichen Leben auf den Teilebehältern verwenden werde, weshalb ich möchte, dass sie eindeutig ist und die nächste Nummer im Satz ist. Ich werde tun, was Sie gesagt haben, und alle Kategorien abrufen und die größte in der Menge finden. Ich bin sicher, es gibt etwas wie max(), die ich in der Abfrage verwenden können. Ich werde mich über Fetch-Anfragen informieren.

0 Stimmen

Mit einer Fetch-Anfrage können Sie die höchste ID mit einem Sortierdeskriptor abrufen und dann lastObject auf dem Ergebnis-Array aufrufen.

0 Stimmen

Eine Frage, wenn ich die Methode (void) awakeFromInsert verwende, erhalte ich zwei von allem in der Tabelle. Der einzige Weg, dies zu stoppen, ist, die gesamte Methode auszukommentieren. Wissen Sie, warum ich einen Haltepunkt in die Methode gesetzt habe, die nur einmal aufgerufen wird, wenn ich die neue Schaltfläche drücke.

1voto

Rich Punkte 1082

So hat Apple das Autoinkrement implementiert:

 - (void) awakeFromInsert
     {
    [super awakeFromInsert];
    static int tempID = 0;
    [self setValue:[NSNumber numberWithInt:++tempID] forKey:@"id"];
}

6 Stimmen

VERWENDEN SIE DAS NICHT! Der ursprüngliche Apple-Beispielcode enthält einen Hinweis, dass der obige Ausschnitt nur zur Veranschaulichung dient und nicht in Produktionscode verwendet werden sollte. Es setzt den Auto-Increment-Wert bei jedem Start der App auf 0 zurück.

0 Stimmen

Aber dann wieder, mit einem zusätzlichen dispatch_once, um tatsächlich holen die max "id" für die aktuelle Entität könnte funktionieren; solange alle Einfügungen sind sicher, nicht gleichzeitig sein

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X