如何在不将其添加到数据库的情况下使用 NSManagedObject?

How to use NSManagedObject without adding it to db?

我有 class 继承了使用我的数据库模型生成的 NSManagedObject

// .h
@interface Sketch : NSManagedObject

@property (nonatomic, retain) NSDate * added;
@property (nonatomic, retain) NSString * board;
@property (nonatomic, retain) NSString * filepath;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSString * filename;

@end

// .m
@implementation Sketch

@dynamic added;
@dynamic board;
@dynamic filepath;
@dynamic title;
@dynamic filename;

@end

我在 UITableView 中使用 class 个实例。现在我需要添加一些没有存储在数据库中的实例(只是为了在列表中显示它们):

Sketch sketch = [[Sketch alloc] init];

但是在尝试设置实例属性时

sketch.title = @"test title";

我遇到异常:

-[Sketch setTitle:]: unrecognized selector sent to instance 0x7ff112c13e30

这是否意味着我必须通过仅将它们添加到托管上下文来创建实例(即使我不打算存储它们)?

[NSEntityDescription insertNewObjectForEntityForName:SKETCH_ENTITY
                                     inManagedObjectContext:context];

不,您可以创建 NSManagedObject 子类的实例,然后 将它们添加到托管对象上下文中 (虽然我建议不要这样做)。您的 Sketch 对象有问题,而不是 NSManagedObjectNSManagedObjectContext.

唯一的问题是你应该像这样创建它:

NSManagedObjectContext *moc = ... // your managed object context
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Sketch"
                                          inManagedObjectContext:moc];
// note nil for context
Sketch *unassociatedObject =
    (Sketch *)[[NSManagedObject alloc] initWithEntity:entity
                       insertIntoManagedObjectContext:nil];

有关详细信息,请参阅 this answer