【问题标题】:Core Data save successful, but no data in database核心数据保存成功,但数据库中没有数据
【发布时间】:2012-10-25 13:59:36
【问题描述】:

我一直致力于将 Core Data 添加到我的 iPhone 应用程序中,但遇到了一些非常令人沮丧的问题。当我在我的上下文中调用 save 时,保存成功返回,但是没有数据被添加到我的数据库中(我在模拟器上运行它并查看 SQLITE 文件进行检查)。

我正在使用this post 中的MYDocumentHandler 类在多个类中使用单个UIManagedDocument。我在AppDelegate 中运行代码如下:

if (!self.document) {
    [[MYDocumentHandler sharedDocumentHandler] performWithDocument:^(UIManagedDocument *document) {
        self.document = document;
        self.context = document.managedObjectContext;
        [self loadView];
    }];
}

返回文档后,loadView 方法会设置我的视图控制器。在我使用核心数据的视图控制器中,我再次使用这样的东西:

- (void)viewDidLoad
{
    [super viewDidLoad];

    if(!self.document){
        [[MYDocumentHandler sharedDocumentHandler] performWithDocument:^(UIManagedDocument *document) {
            self.document = document;
            self.context = document.managedObjectContext;
            [self loadAll];
        }];
    }


}

loadAll 方法设置视图的所有内容。当我尝试保存数据时,我使用以下内容:

for (int i = 0; i < [jsonArray count]; i++) {
                    NSDictionary *dictionary = [jsonArray objectAtIndex:i];
                    ProjectObject *tempProject = [[ProjectObject alloc] initWithDict:dictionary andETag:etag];
                    [tempAllProjects addObject:[Projects newProject:tempProject withContext:self.context]];
                    [tempProject release];
                }


                [self saveWithContext:self.context];

我的saveWithContext 方法如下所示:

- (BOOL) saveWithContext:(NSManagedObjectContext *)context{
    NSError *error = nil;

    if (context != nil) {
        if ([context hasChanges] && ![context save:&error]) {
            DLog(@"Unresolved error %@, %@", error, [error userInfo]);
        } else{
            DLog(@"save was successful");
            return YES;
        }
    }else{
        DLog(@"context is nil");
        return NO;
    }
}

我总是收到save was successful 消息,并且我从 MYDocumentHandler 文件中获得了正确的消息。不幸的是,数据根本没有进入数据库。数据肯定存储在上下文中,但不会进入数据库。有什么想法吗?

编辑: 这是我创建实体的代码:

+ (Projects *) newProject:(ProjectObject *)project withContext:(NSManagedObjectContext *)context
{
    Projects *newProject = nil;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Projects"];
    request.predicate = [NSPredicate predicateWithFormat:@"project_id = %@", project.project_id];
    NSArray *results = [context executeFetchRequest:request error:nil];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if([results count] > 0){
        newProject = [results objectAtIndex:0];
        newProject.account_id = [NSString stringWithFormat:@"%@", [defaults objectForKey:@"account_id"]];

    } else {
        newProject = [NSEntityDescription insertNewObjectForEntityForName:@"Projects" inManagedObjectContext:context];
    }

    newProject.account_id = [NSString stringWithFormat:@"%@", [defaults objectForKey:@"account_id"]];
    newProject.project_id = project.project_id;
    newProject.name = project.name;
    newProject.project_description = project.description;
    newProject.updated_at = project.updated_at;
    newProject.starred = project.starred;
    newProject.etag = project.etag;

    newProject.synced = [self hasConnection] ? [NSNumber numberWithInt:1] : [NSNumber numberWithInt:0];
    return newProject;
}

【问题讨论】:

  • 可能只是您的数据没有被添加?如果在 saveWithContext 中设置断点,[context hasChanged] 是否返回 true?
  • 嗯。你是对的。上下文没有改变。有什么办法可以纠正吗?
  • 如果您显示创建新实体的代码,您可能会获得一些帮助。

标签: iphone objective-c ios core-data


【解决方案1】:

我在this 帖子中找到了解决方案。不确定这是否是处理它的最佳方法。如果有更好的选择,请告诉我。

【讨论】:

    【解决方案2】:

    更改后,您没有保存管理对象上下文。我已将这些行添加到您的代码中。 请检查它现在是否有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-24
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多