0

私が宣言したように、これは.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クラスではなくView Controllerでコアデータを宣言する方法は?

  2. AppDelegate でこのコードを使用している間、なぜ機能するのでしょうか?

  3. 通常のクラスに配置した後、エラーが発生しています

    like=[AppDelegate managedObjectContext]

4

1 に答える 1

0

2. AppDelegate でこのコードを使用している間、なぜ機能するのですか?

3.通常のクラスに配置した後、= [AppDelegate managedObjectContext]のようなエラーが発生します

あなたの答えがあります-コードがアプリデリゲートにあるとまだ考えています。

これ

[AppDelegate managedObjectContext]

する必要があります

[coreData managedObjectContext]

そして、これが機能するには、すべてが適切に配線されている必要があります。

ちなみに、クラス「coreData」の呼び出しはかなりひどいものです。欠落している大文字については忘れます (Obj-C クラスは伝統的に、クラスであることを強調するために大文字で始まります)。私が指摘する理由は、既に存在するものの名​​前を使用しているためです (バー 1 文字)。途方もなく混乱する可能性があります。

2 つの提案 クラスの名前を適切な名前に変更します。クラスをどこからでも呼び出せるシングルトンにします。

于 2015-08-24T14:15:43.593 に答える