我想使用核心数据来保存某些实体,比如事件。
因此我使用了课程DSManagedObject
和Event
类DSManagedObject
扩展NSManagedObject
并具有所有实体都可以使用的一般方法。
课程Event
扩展为DSManagedObject
。
以下代码为DSManagedObject.h
和.m
。 .m
中的相关代码只是getContext
- 方法。
@interface DSManagedObject : NSManagedObject
+ (NSManagedObjectContext *)getContext;
- (NSArray*)getEntitiesForName:(NSString*)_entityName context:(NSManagedObjectContext*)_context;
- (Event*)getEntityForName:(NSString*)_entityName forEventId:(NSInteger)_eventId context:(NSManagedObjectContext*)_context;
- (bool)deleteEntityForName:(NSString*)_entityName forEventId:(NSInteger)_eventId context:(NSManagedObjectContext*)_context;
@end
@implementation DSManagedObject
+ (NSManagedObjectContext *)getContext {
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES],
NSInferMappingModelAutomaticallyOption, nil];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSURL *storeUrl = [NSURL fileURLWithPath:[basePath stringByAppendingFormat:@"DesertStorm.sqlite"]];
NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles:nil]];
NSError *error = nil;
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
NSLog(@"error loading persistent store..");
[[NSFileManager defaultManager] removeItemAtPath:storeUrl.path error:nil];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}
NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init];
[context setPersistentStoreCoordinator:persistentStoreCoordinator];
return context;
}
现在在课程Event
中,我想调用initWithEntity
,但之后会出现错误[Event managedObjectModel] unrecognized selector sent to instance
。
什么原因 ? :(
@interface Event : DSManagedObject
@property (assign) NSInteger eventId;
@end
@implementation Event
@dynamic eventId;
- (id)init {
NSEntityDescription *entity = [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:[DSManagedObject getContext]];
self = [self initWithEntity:entity insertIntoManagedObjectContext:[DSManagedObject getContext]]; // error occurs
self = [super init];
if (self) {
}
return self;
}
...
@end
我是使用核心数据的新手,所以要表现出理解;) 谢谢你的帮助
PS:如果你想知道我为什么要覆盖init
- 方法......复杂的原因^^
答案 0 :(得分:5)
来自Core Data doc:
在典型的Cocoa类中,您通常会覆盖指定的 初始化程序(通常是init方法)。在NSManagedObject的子类中, 有三种不同的方法可以自定义初始化-by 覆盖initWithEntity:insertIntoManagedObjectContext:, awakeFromInsert或awakeFromFetch。 您不应该覆盖init。您 不鼓励压倒一切 initWithEntity:insertIntoManagedObjectContext:当状态发生变化时 在此方法中可能无法与撤消和重做正确集成。该 另外两个方法,awakeFromInsert和awakeFromFetch,允许你 区分两种不同的情况:
所以灵魂要覆盖initWithEntity:insertIntoManagedObjectContext:或利用awakeFromInsert
或awakeFromFecth
。如果你愿意,可以自称为ovveride
您调用initWithEntity:insertIntoManagedObjectContext:
或insertNewObjectForEntityForName:inManagedObjectContext:
。
您想实现某个特定目标吗?
修改强>
尝试覆盖initWithEntity:insertIntoManagedObjectContext:
而不是init
- (id)initWithEntity:(NSEntityDescription*)entity insertIntoManagedObjectContext:(NSManagedObjectContext*)context
{
self = [super initWithEntity:entity insertIntoManagedObjectContext:context];
if (self != nil) {
// Perform additional initialization.
}
return self;
}
该方法是NSManagedObject的指定初始值设定项。您不能仅通过发送init来初始化托管对象。有关详细信息,请参阅NSManagedObject
类。
答案 1 :(得分:0)
我在init
- 方法中解决了问题。
我仍然会覆盖这个方法(我知道我不应该......但无论如何)
这是代码
- (id)init {
return [NSEntityDescription insertNewObjectForEntityForName:@"Event" inManagedObjectContext:[DSManagedObject getContext]];
}
这将返回NSManagedObject并且不会发生错误:)