为什么我的模型不会保存到Core Data?

时间:2014-04-06 12:07:16

标签: ios objective-c core-data

我对Objective-C很新,我正试图搞乱Core Data。我有以下App Delegate接口和实现:

#import <UIKit/UIKit.h>

@interface SDTAppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (nonatomic, strong) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, strong) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;

- (void)saveManagedObjectContext;
- (NSManagedObjectContext *)setupManagedObjectContext;
- (NSManagedObjectModel *)setupManagedObjectModel;
- (NSPersistentStoreCoordinator *)setupPersistentStoreCoordinator;
- (NSURL *)applicationDocumentsDirectory;

@end

实施

#import "SDTAppDelegate.h"
#import "ToDoItem.h"

@implementation SDTAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Get the managed object context and associate it to the app delegate
    self.managedObjectContext = [self setupManagedObjectContext];

    return YES;
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    [self saveManagedObjectContext];
}

/**
 * Save the MOC!
 */
- (void)saveManagedObjectContext
{
    NSError *error = nil;

    if (self.managedObjectContext != nil)
    {
        if ([self.managedObjectContext hasChanges] && ![self.managedObjectContext save:&error])
        {
            /*
             THIS NEEDS TO BE REPLACED
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }
}

#pragma mark - Core Data stack

/**
 Returns the managed object context for the application.
 If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
 */
- (NSManagedObjectContext *)setupManagedObjectContext
{
    if (self.managedObjectContext != nil)
    {
        return self.managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self setupPersistentStoreCoordinator];

    if (coordinator != nil)
    {
        self.managedObjectContext = [[NSManagedObjectContext alloc] init];
        [self.managedObjectContext setPersistentStoreCoordinator:coordinator];
    }

    return self.managedObjectContext;
}

/**
 * Return the managed object model. If it doesn't exist, create it.
 */
- (NSManagedObjectModel *)setupManagedObjectModel
{
    if (self.managedObjectModel != nil)
    {
        return self.managedObjectModel;
    }

    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];

    self.managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    return self.managedObjectModel;
}

/**
 * Return the persistent store coordinator. If it doesn't exist, create it.
 */
- (NSPersistentStoreCoordinator *)setupPersistentStoreCoordinator
{
    if (self.persistentStoreCoordinator != nil)
    {
        return self.persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Model.sqlite"];

    NSError *error = nil;

    self.persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self setupManagedObjectModel]];

    if (![self.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                       configuration:nil
                                                                 URL:storeURL
                                                             options:nil
                                                               error:&error])
    {
        /*
         THIS NEEDS TO BE REPLACED
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }

    return self.persistentStoreCoordinator;
}

#pragma mark - Application's Documents directory

/**
 * Return the URL to the application's Documents directory.
 */
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}

@end

然后在我的控制器中我有以下内容来保存新模型:

// Take the managed object context from the app delegate
SDTAppDelegate *appDelegate = (SDTAppDelegate *)[UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = appDelegate.managedObjectContext;

// Add the new item
ToDoItem *newItem = [NSEntityDescription insertNewObjectForEntityForName:@"ToDoItem" inManagedObjectContext:context];
newItem.item = self.textField.text;
newItem.completed = 0;

无论发生什么,我都无法保存应用程序。它在界面中显示正常,但是当我退出并重新启动时,数据不再存在。我猜这是我的持久存储有问题吗?

1 个答案:

答案 0 :(得分:2)

您应该保存上下文以便保存在持久性存储中。

NSError *error;
[context save:&error];

希望它有所帮助。干杯