MagicalRecords使用NSSet添加记录

时间:2016-05-31 00:31:28

标签: objective-c core-data magicalrecord

我只是在说学习CoreData和MR。我正在使用Ray Wenderlich的BeerTracker教程,并且在将记录添加到空数据库时遇到问题。

// 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 * cells;

它似乎在主表上工作,但后来我在示例中设置了关系:( Section是一个Cell很多)

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

不兼容的指针类型分配给&#39; NSSet * _Nullable&#39;来自&#39; Cell * _Nullable&#39;

如果我将其更改为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 个答案:

答案 0 :(得分: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]];