2010-02-21 4 views
16

die Situation holen:Coredata: Wie ein bestimmtes Objekt mit einem Prädikat

ich eine komplette Tabelle aus meiner SQLLite Kerndaten Datenbank holen und zeigen es in einem Tableview wie folgt aus:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyTable" 
              inManagedObjectContext:managedObjectContext]; 

Die Herausforderung:

Wie bekomme ich die EntryID und hole den spezifischen Eintrag aus der Datenbank (zB wenn ich auf einen Eintrag klicke)? Ich denke, das geht in die richtige Richtung?

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(id = %@)", myEntryID]; 

Antwort

45

Wenn Sie einen Eintrag Objekt haben entry genannt, wäre es ein Prädikat wie folgt sein:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(SELF = %@)", entry]; 

was in etwa gleichwertig ist

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(objectID = %@)", entry.objectID]; 

Für eine NSManagedObjectID, erhalten Sie so etwas wie:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(objectID = %@)", myEntryID]; 
+3

+1 Wenn Sie ein Prädikat verwenden müssen, ist dies der richtige Weg. Andernfalls wäre '- [NSManagedObjectContext objectWithID:]' wahrscheinlich besser. –

+2

Natürlich, aber z.B. 'NSFetchedResultsController' müssen Sie ein Prädikat verwenden. – MrMage

+5

Das "self" -Schlüsselwort funktioniert auch, wenn Sie * multiple * Objekte pro Objekt-IDs abrufen: 'NSPredicate * PrädikatForFetch = [NSPredikat PrädikatWithFormat: @" (self IN% @) ", arrayOfNSManagedObjectIDs];' – Wienke

3

Sie könnten -[NSManagedObject objectID] und -[NSManagedObjectContext objectWithID:] suchen.

2

Beim Erstellen der Tabelle verwenden Sie entweder ein Array, das von einem Abruf zurückgegeben wird, oder das implizite Array in einem NSFetchResultsController. Daher hat das gewünschte Objekt im Array/Controller denselben Index wie in der Tabelle.

Also, es wird nur eine Frage des Aufrufs:

myObject=[fetchedArray objectAtIndex:tableRowIndex]; 

oder

myObject=[myFetchedResultsController objectAtIndexPath:tableRowIndex]; 

Das ist das wahre Genie des uitable. Es spiegelt immer genau das Datenmodell wider. Sie müssen nie zwischen den Tabellenindizes und Ihren Datenmodellindizes hin und her übersetzen.

6

Dies ist richtiges Prädikat:

[NSPredicate predicateWithFormat:@"SELF = %@", objectID]; 

Dabei ist objectIDNSManagedObjectID Instanz.

+0

Dies war das erste Prädikat, das für mich funktionierte. –

Verwandte Themen