Я просто заявляю, чтобы узнать 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
С нескольких элементов: 'setWithObjects:'. – Willeke
@ Виллеке Исправлено. Благодарю. – sschale