首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从另一个视图控制器访问核心数据中的实体

问无法从另一个视图控制器访问核心数据中的实体
EN

Stack Overflow用户
提问于 2015-03-31 16:13:39
回答 1查看 99关注 0票数 0

我是一个新手目标-C程序员和核心数据用户。这是我第一次使用核心数据。我要做的是把实体放在一个核心数据数据库中,然后在另一个中检索和编辑它们。

以下是我的ViewController.m中的代码:

代码语言:javascript
复制
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *documentsDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];

    NSString *documentName = @"myDocument";
    NSURL *url = [documentsDirectory URLByAppendingPathComponent:documentName];
    UIManagedDocument *document = [[UIManagedDocument alloc]initWithFileURL:url];
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:[url path] ];
    if(fileExists)
    {
        [document openWithCompletionHandler:^(BOOL success){
            if(!success) NSLog(@"Error (this isn't printed)");
        }];
    }
    else
    {
        [document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){
            if(!success) NSLog(@"Error (this isn't printed)");
        }];

        NSManagedObjectContext *context = document.managedObjectContext;

        QuestionResponse *question1 = [NSEntityDescription insertNewObjectForEntityForName: @"QuestionResponse" inManagedObjectContext: context];
        QuestionResponse *question2 = [NSEntityDescription insertNewObjectForEntityForName: @"QuestionResponse" inManagedObjectContext: context];
        QuestionResponse *question3 = [NSEntityDescription insertNewObjectForEntityForName: @"QuestionResponse" inManagedObjectContext: context];
        QuestionResponse *question4 = [NSEntityDescription insertNewObjectForEntityForName: @"QuestionResponse" inManagedObjectContext: context];

        question1.question = @"What is your favorite food?";
        question2.question = @"Who is your favorite fictional character?";
        question3.question = @"Name someone who loves you:";
        question4.question = @"What is your favorite place (real or fictional)?";

        question1.order = [NSNumber numberWithInt:1];
        question2.order = [NSNumber numberWithInt:2];
        question3.order = [NSNumber numberWithInt:3];
        question4.order = [NSNumber numberWithInt:4];
        question1.group = [NSNumber numberWithInt:1];
        question2.group = [NSNumber numberWithInt:1];
        question3.group = [NSNumber numberWithInt:2];
        question3.group = [NSNumber numberWithInt:2];
        question1.display = [NSNumber numberWithBool:NO];
        question2.display = [NSNumber numberWithBool:NO];
        question3.display = [NSNumber numberWithBool:NO];
        question4.display = [NSNumber numberWithBool:NO];

        NSFetchRequest* request2 = [NSFetchRequest fetchRequestWithEntityName:@ "QuestionResponse"];
        NSError* error2 = nil;
        NSArray* results = [context executeFetchRequest:request2 error:&error2];
        if (!results || !results.count){
            NSLog(@"No elements (this isn't printed)");
        }
        if(results.count == 4)
        {
            NSLog(@"We have four entities (this is what is printed)");
        }        
    }
}

M在我的答疑视图控制器中,这是代码:

代码语言:javascript
复制
 - (IBAction)answerQuestion1:(id)sender {    
    //File creation begins here (same as in View Controller)
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSURL *documentsDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];
    NSString *documentName = @"myDocument";    
    NSURL *url = [documentsDirectory URLByAppendingPathComponent:documentName];
    UIManagedDocument *document = [[UIManagedDocument alloc]initWithFileURL:url];
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:[url path] ];
    if(fileExists)
    {
        [document openWithCompletionHandler:^(BOOL success){
            if(!success) NSLog(@"Error");
        }];
        NSLog(@"File Exists (this is printed)");
    }
    else
    {
        [document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success){
            if(!success)NSLog(@"There has been a problem (this isn't printed)");
        }];
    }
    NSManagedObjectContext *context = document.managedObjectContext;
    //File Creation ends here

    NSError *error = nil;

    NSFetchRequest* request2 = [NSFetchRequest fetchRequestWithEntityName:@ "QuestionResponse"];
    NSError* error2 = nil;
    NSArray* results = [context executeFetchRequest:request2 error:&error2];
    if (!results || !results.count){
        NSLog(@"No entities (this is what is printed");
    }
    else
    {
        NSLog(@"Some entities (this isn't printed)");
    }
}

在我的ViewController.m中,核心数据有四个元素,但是当我试图在AnswereViewController.m中访问它们时,核心数据中没有任何内容。为什么会发生这种情况,我如何访问AnswereViewController.m中的元素?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-31 16:25:16

为了成功地使用CoreData,您必须首先了解它的流程。本质上,CoreData可以分为两个主要部分:

  1. 数据库(所以是.sqlite文件本身)
  2. 持久存储协调器(此后称为psc)

到目前为止,您在ViewController.m中所做的是告诉编译器将4个对象插入到managedObjectContext中。这是在psc级别上完成的。psc的作用就像所有数据库更改的便签。在您真正告诉它保存它之前,它将只存在于psc中,而不是在您的.sqlite文件中。那么你需要做的就是打电话给:

代码语言:javascript
复制
[context save:&error2]

这将告诉编译器将psc的当前状态推入数据库,以使其保持不变。

希望这能帮到你。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29373391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档