如何在备用类中管理核心数据?

时间:2015-08-24 14:05:06

标签: objective-c core-data nsmanagedobject nsmanagedobjectcontext nspersistentstore

这是我声明的.h文件

     @protocol CoreData <NSObject>

    -(NSManagedObjectContext *)managedObjectContext;

    @end


    @interface coreData : NSObject
    {
        id<CoreData> delegate;
    }

    @property (retain)id delegate;
    @property (readonly,strong ,nonatomic) NSManagedObjectContext *managedObjectContext;
    @property (readonly,strong ,nonatomic) NSManagedObjectModel *managedObjectModel;
    @property (readonly,strong ,nonatomic) NSPersistentStoreCoordinator *persistStoreCoordinator;

    -(void)saveContext;
    -(NSURL *)applicationDocumentsDirectory;
    @end

这是.m文件

@implementation coreData

@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistStoreCoordinator = _persistStoreCoordinator;

-(void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if(managedObjectContext !=nil)
    {
        if([managedObjectContext hasChanges] && ![managedObjectContext save:&error]){

            NSLog(@"Unresolved error %@,%@",error,[error userInfo]);
            abort();
        }
    }
}
#pragma mark -core data stack

-(NSManagedObjectContext *)managedObjectContext
{
    if(_managedObjectContext !=nil)
    {
        return _managedObjectContext;
    }
    NSPersistentStoreCoordinator *coordinator =[self persistStoreCoordinator];
    if (coordinator !=nil)
    {
        _managedObjectContext=[[NSManagedObjectContext alloc] init];
        [_managedObjectContext setPersistentStoreCoordinator:coordinator];

    }
    return _managedObjectContext;
}
-(NSManagedObjectModel *)managedObjectModel
{
    if(_managedObjectModel !=nil)
    {
        return _managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Superallocation" withExtension:@"momd"];
    _managedObjectModel =[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
}
-(NSPersistentStoreCoordinator *)persistStoreCoordinator
{
    if(_persistStoreCoordinator !=nil)
    {
        return _persistStoreCoordinator;
    }
    NSURL *storeURL =[[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"SuperantZ.sqlite"];
    NSError *error = nil;
    _persistStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if([_persistStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {
        NSLog(@"unresolved error %@,%@",error,[error userInfo]);
        abort();
    }
    return _persistStoreCoordinator;
}
-(NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

问题:

  1. 如何在视图控制器中声明核心数据而不是在AppDelegate类中?

  2. 在AppDelegate中使用此代码的原因是什么?

  3. 在我放入正常课程后,它给了我错误

    like=[AppDelegate managedObjectContext]

1 个答案:

答案 0 :(得分:0)

  

2.在AppDelegate中使用此代码时,它的工作原理是什么?

     

3.在我放入普通类之后,它给出了我的错误,如= [AppDelegate managedObjectContext]

有你的答案 - 它仍然认为代码在app代理中。

这个

[AppDelegate managedObjectContext]

应该是

[coreData managedObjectContext]

所有内容都需要正确连接才能实现。

顺便说一下,调用类'coreData'非常可怕。我会忘记丢失的大写字母(Obj-C类传统上以资本开头强化它们是类),我指出它的原因是你使用的是已经存在的东西的名字(一个字母条)和可能会变得非常混乱。

2条建议 将课程重命名为合理的课程。 使类成为可以从任何地方调用的单例。