ios - 为什么我的模型不能保存到 Core Data?

标签 ios objective-c core-data

我是 Objective-C 的新手,我想弄乱 Core Data。我有以下 App Delegate 接口(interface)和实现:

#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

然后在我的 Controller 中我有以下内容来保存一个新模型:

// 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;

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

最佳答案

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

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

希望对您有所帮助。干杯

关于ios - 为什么我的模型不能保存到 Core Data?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22893795/

相关文章:

iphone - iOS:如何在崩溃日志中设置标识符和版本字段?

objective-c - NSSegmentedControl -selectedSegment 始终返回 0

ios - 如果没有选中单元格,则禁用 "Next"按钮

objective-c - CoreData:将MagicalRecord与FetchedResultsController和自定义sortDescriptor结合使用

multithreading - 核心数据专用队列死锁

objective-c - objective-c 中的方位角/方位角计算

c# - 如何将使用 GKAchievement 的简单方法从 Objective-C 转换为 C#?

ios - FlatList 使用 Redux 重新渲染

ios - 如何通过一个按钮连接两个 View Controller ?

objective-c - 在 Objective-C 中为 POST HTTP 请求生成 JSON 负载