我想使用核心数据来保留事件等某些实体。
因此,我使用了DSManagedObject
和Event
类
类DSManagedObject
扩展了NSManagedObject
并具有所有实体都可以使用的常规方法。
类Event
扩展了DSManagedObject
。
以下代码是DSManagedObject.h
和.m
。 .m
中的相关代码只是getContext
-method。
@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
-method ...复杂原因^^ 最佳答案
从Core Data doc:
在典型的可可类中,您通常会覆盖指定的
初始化程序(通常是init方法)。在NSManagedObject的子类中,
您可以通过三种方法自定义初始化-
覆盖initWithEntity:insertIntoManagedObjectContext :,
awakeFromInsert或awakeFromFetch。 您不应覆盖init。 您
不鼓励改写
initWithEntity:insertIntoManagedObjectContext:状态更改时
此方法可能无法正确地与撤消和重做集成。的
另外两个方法awakeFromInsert和aawakeFromFetch可让您
区分两种不同情况:
因此,解决方案是重写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
类。