无法从另一个视图控制器访问核心数据中的实体
Can't Access Entity In Core Data From Another View Controller
我是新手Objective-C 程序员和核心数据用户。这是我第一次使用核心数据。我想做的是将实体放入核心数据数据库,然后在另一个视图控制器中检索和编辑它们。
这是我的 ViewController.m:
中的代码
- (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)");
}
}
}
在我的回答中ViewController.m这是代码:
- (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 中,核心数据有四个元素,但是当我尝试在 AnswerViewController.m 中访问它们时,核心数据中没有任何内容。为什么会发生这种情况以及如何从 AnswerViewController.m?
访问我的元素
要想用好CoreData,首先要了解它的流程。从本质上讲,CoreData 可以分为两个主要部分:
- 数据库(所以 .sqlite 文件本身)
- 持久存储协调器(以下称为 psc)
到目前为止,您在 ViewController.m 中所做的是告诉编译器将您的 4 个对象插入到您的 managedObjectContext 中。这是在 psc 级别上完成的。 psc 就像所有数据库更改的暂存器。在你真正告诉它保存之前,它只会存在于 psc 而不是你的 .sqlite 文件中。你需要做的就是打电话:
[context save:&error2]
这将告诉编译器将您当前的 psc 状态推送到数据库中,以便它持续存在。
希望对您有所帮助。
我是新手Objective-C 程序员和核心数据用户。这是我第一次使用核心数据。我想做的是将实体放入核心数据数据库,然后在另一个视图控制器中检索和编辑它们。
这是我的 ViewController.m:
- (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)");
}
}
}
在我的回答中ViewController.m这是代码:
- (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 中,核心数据有四个元素,但是当我尝试在 AnswerViewController.m 中访问它们时,核心数据中没有任何内容。为什么会发生这种情况以及如何从 AnswerViewController.m?
访问我的元素要想用好CoreData,首先要了解它的流程。从本质上讲,CoreData 可以分为两个主要部分:
- 数据库(所以 .sqlite 文件本身)
- 持久存储协调器(以下称为 psc)
到目前为止,您在 ViewController.m 中所做的是告诉编译器将您的 4 个对象插入到您的 managedObjectContext 中。这是在 psc 级别上完成的。 psc 就像所有数据库更改的暂存器。在你真正告诉它保存之前,它只会存在于 psc 而不是你的 .sqlite 文件中。你需要做的就是打电话:
[context save:&error2]
这将告诉编译器将您当前的 psc 状态推送到数据库中,以便它持续存在。
希望对您有所帮助。