2016-05-31 7 views
0

Ich bin gerade dabei, CoreData und MR zu lernen. Ich benutze das BeerTracker-Tutorial von Ray Wenderlich und habe Probleme beim Hinzufügen von Datensätzen zu einer leeren Datenbank.MagicalRecords Hinzufügen von Datensätzen mit NSSet

// beer.h  
@class BeerDetails; 



@interface Beer : NSManagedObject 

@property (nonatomic, retain) NSString * name; 
@property (nonatomic, retain) BeerDetails *beerDetails; 

@end 

//beerdetails.h: 


@interface BeerDetails : NSManagedObject 

@property (nonatomic, retain) NSString * image; 
@property (nonatomic, retain) NSString * note; 
@property (nonatomic, retain) NSNumber * rating; 
@property (nonatomic, retain) NSManagedObject *beer; 



// where data is being added to the tables: 
Beer *paleLager = [Beer createEntity]; 
paleLager.name = @"Pale Lager"; 
paleLager.beerDetails = [BeerDetails createEntity]; 
paleLager.beerDetails.rating = @3; 

Mein Tisch hat eine Eins-zu viele, so dass es NSSet verwendet:

@property (nullable, nicht-atomaren, behalten) NSSet * Zellen;

Es scheint auf der Primärtabelle zu arbeiten, aber dann habe ich die Beziehung ebenso wie im Beispiel: (Abschnitt ist eine Zelle viele ist)

 Section *tempSection = [Section MR_createEntity]; 
     tempSection.button = subButton; 
     tempSection.cells = [Cell MR_createEntity]; << Warning Here 

Inkompatible Zeigertypen zuweisen zu ‚NSSet * _Nullable 'von' Cell * _Nullable '

Wenn ich es in eine 1 zu 1 Beziehung ändern, scheint es zu funktionieren. Der Teil, der mich verwirrt, sind die NSSet * -Zellen.

Ich kann kein Beispiel finden, das NSSet verwendet und Datensätze manuell in die Datei lädt.

Es sieht so aus, als ob ich mit NSSet nichts Besonderes machen muss, wenn ich normalerweise Datensätze hinzufüge, nur wenn ich sie wie BeerTracker hinzufüge. Ich denke, Coredata ist für einen Zeiger auf ein NSSet Objekt suchen, aber ich weiß nicht, wie das in dieser Zeile ein:

tempSection.cells = [Cell MR_createEntity]; 

Dank @sschale, das in der richtigen Richtung gesetzt mir geholfen. Nur so, dass jemand anderes davon profitieren könnten, hier ist der Rest:

ein Wörterbuch mit den Rekordwerten erstellt und modifiziert, um die Coredata-Methode:

// added "with:(NSDictionary *) inputData; 
- (void)addCells:(NSSet<Cell *> *)values with:(NSDictionary *) inputData; 

// this call create the entity and passes the dictionary of keys/values 
[tempSection addCells:(NSSet *)[Cell MR_createEntity] with:myDictionary]; 

// here's an example of changing the values inside the 'addCells:with:' method 
    [values setValue:[inputData objectForKey:@"overpic"] forKey:@"overpic"]; 
    [values setValue:[inputData objectForKey:@"pictitle"] forKey:@"pictitle"]; 
    [values setValue:[inputData objectForKey:@"position"] forKey:@"position"]; 

Ich weiß nicht, ob dies der beste Weg ist, aber bisher scheint es zu funktionieren. auf diesem Artikel über die Leistung Ran, dass jemand interessiert sein könnte in: http://www.cocoawithlove.com/2009/11/performance-tests-replacing-core-data.html

Antwort

1

Hier die Syntax ist einen Satz in Objective C mit einem einzelnen Objekt zu erstellen:

tempSection.cells = [NSSet setWithObject:[Cell MR_createEntity]];

Um es zu tun mit mehr Artikeln verwenden Sie:

tempSection.cells = [NSSet setWithObjects:[Cell MR_createEntity], [Cell MR_createEntity], ..., nil];

Häufiger Sie die Zugriffsmethoden verwenden möchten, die für Sie in Ihrererstellt werdenDatei:

- (void)addCellsObject:(Cell *)value; 
- (void)removeCellsObject:(Cell *)value; 
- (void)addCells:(NSSet<Cell *> *)values; 
- (void)removeCells:(NSSet<Cell *> *)values; 

Also in diesem Fall würden Sie rufen:

[tempSection addCellsObject:[Cell MR_createEntity]];

+0

Mit mehr Artikeln: 'setWithObjects:'. – Willeke

+0

@Willieke Fest. Vielen Dank. – sschale

Verwandte Themen