MagicalRecords 使用 NSSet 添加记录

Posted

技术标签:

【中文标题】MagicalRecords 使用 NSSet 添加记录【英文标题】:MagicalRecords adding records with NSSet 【发布时间】:2016-05-31 00:31:28 【问题描述】:

我只是说要学习 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 is one Cell is many)

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

从“Cell * _Nullable”分配给“NSSet * _Nullable”的指针类型不兼容

如果我将其更改为一对一的关系,它似乎可以工作。让我困惑的部分是 NSSet *cells。

我找不到任何使用 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]];

【讨论】:

有多个项目:setWithObjects:. @Willeke 已修复。谢谢。

以上是关于MagicalRecords 使用 NSSet 添加记录的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecords importFromArray 返回空数组

Magical Records:加载要在本地上下文中更新的记录

Magical Records - 如何使用关键路径映射关系?

使用 NSPredicate 来判断 NSSet 是不是包含来自另一个 NSSet 的对象 [重复]

将 NSNumber 的 NSSet 更改为 int 的 NSSet

使用 NSSet 关系填充 cellForRow