2016-05-31 2 views
0

Я просто заявляю, чтобы узнать CoreData и MR. Я использую учебник BeerTracker от Ray Wenderlich и проблема с добавлением записей в пустую базу данных.MagicalRecords добавляет записи с 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; 

Моей таблица имеет один ко многим, поэтому он использует NSSet:

@property (обнуляемая, неатомические, сохраняющая) NSSet * клетку;

Это, кажется, работает на основной таблице, но затем я установил отношения так же, как в примере: (раздел является один Клетка много)

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

Несовместимых типов указателей относящего «NSSet * _Nullable 'from' Cell * _Nullable '

Если я изменю его на отношения 1 к 1, это сработает. Часть, которая меня смущает, это клетки NSSet *.

Я не могу найти пример, который использует NSSet и вручную загружает записи в файл.

Похоже, что мне не нужно ничего делать с NSSet, когда обычно добавляете записи, только при их добавлении, например, в BeerTracker. Я предполагаю, что CoreData ищет указатель на объект NSSet, но я не знаю, как установить, что в этой строке:

tempSection.cells = [Cell MR_createEntity]; 

Благодаря @sschale, что помог мне в правильном направлении. Просто так, что кто-то еще может принести пользу, вот остальное:

Я создал словарь со значениями записи и модифицировал CoreData метод:

// 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"]; 

Я не знаю, если это лучший способ, но пока это работает. Натыкался этой статье о производительности, что кто-то может быть интересно: http://www.cocoawithlove.com/2009/11/performance-tests-replacing-core-data.html

ответ

1

Вот синтаксис для создания набора в Objective C с одного объекта:

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

Чтобы сделать это с несколькими элементами используйте:

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

Чаще всего, вы хотите использовать аксессор, которые созданы для вас в ваших +CoreDataProperties.h файл:

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

Таким образом, в этом случае, вы бы назвали:

[tempSection addCellsObject:[Cell MR_createEntity]];

+0

С нескольких элементов: 'setWithObjects:'. – Willeke

+0

@ Виллеке Исправлено. Благодарю. – sschale

Смежные вопросы