核心数据保存和加载到多个实体

核心数据保存和加载到多个实体

问题描述:

核心数据Noob here。核心数据保存和加载到多个实体

我有一个项目,它将数据保存到单个实体没有问题。但是,因为实体有太多的属性(超过100),它会收到警告,我需要对其进行规范化。好的,所以我创建了第二个实体来存储更多的数据和To-One关系。

问题是,当我尝试保存数据时,数据保存并重新加载到第一个实体,但不会保存或从第二个实例重新加载。我必须错过简单的东西。

下面是一些代码:

//ViewDidLoad 
    - (void)viewDidLoad 
{ 
    if (managedObjectContext == nil) { 
     managedObjectContext = [(CoreDataStuffAppDelegate *) [[UIApplication sharedApplication] delegate] managedObjectContext]; 
     NSLog(@"After managedObjectContext: %@", managedObjectContext); 
    } 

    // [self addRecord]; 
    [super viewDidLoad]; 

    if ([self fetchData]) { 
     NSLog(@"after self fetchData patientArray count is %i", [parentArray count]); 
     if ([parentArray count] == 1) { 
      Parent *parentInfo = (Parent *)[parentArray objectAtIndex:0]; 
      parentItem1.text = parentInfo.Mother; 
      NSLog(@"fetching on load %i", [parentArray count]); 

      //Try 1: just going after the relationship route (FAIL: cuz data wont store. stays null) 
     // childItem1.text = parentInfo.ParentToChild.Kid; 

       // Try 2: going the route of directly talking to the second entity 
      childItem1.text = child.Kid; 
     } 
    } 

// Save Record 
    - (void)saveRecord{ 
    if (managedObjectContext == nil) { 
     NSLog(@"there is no context, arrg"); 

    } 
    NSLog(@"array count is %i", [parentArray count]); 
    if ([parentArray count] == 1) { 
     NSManagedObjectContext *context = managedObjectContext;//[parent managedObjectContext]; 
     NSLog(@"context 1 is: %@", context); 

     Parent *parentInfo = (Parent *)[parentArray objectAtIndex:0]; 
     parentInfo.Mother = parentItem1.text; 
     NSLog(@"data says: %@", parentInfo.Mother); 
     NSLog(@"text syas: %@", parentItem1.text); 

     // Try 1, save it through the child relationship thing. (failed) 
    // parentInfo.ParentToChild.Kid = childItem1.text; 
    // NSLog(@"childSave says: D: %@ T: %@", parentInfo.ParentToChild.Kid , childItem1.text); 

     // Try 2. from Resipeas app 
     if (!child) { 
      self.child = [NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:context]; 
      [parent addChildObject:child]; 
      NSLog(@"I hit the child"); 

     } 
     child.Kid = childItem1.text; 
     NSLog(@"1: childSave says: D: %@ T: %@", parentInfo.ParentToChild.Kid , childItem1.text); 
     NSLog(@"2: childSave says: D: %@ T: %@", child.Kid , childItem1.text); 



     NSError *error = nil; 
     if (![context save:&error]) { 
      NSLog(@"context 2 is: %@", context); 
      NSLog(@"major fail %@", [error localizedDescription]); 
     // abort(); 
     } 
    } 
    NSLog(@"saving stuff"); 

} 

// FetchData 
- (BOOL)fetchData { 
    NSLog(@"doing the fetch"); 
    BOOL returnResult = FALSE; 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    if (managedObjectContext == nil) 
    { 
     NSLog(@"ok making a new managed object context"); 
     managedObjectContext = [(CoreDataStuffAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    } 

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Parent" inManagedObjectContext:managedObjectContext]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setFetchBatchSize:1]; 
    NSError *error; 
    NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] mutableCopy]; 
    if (mutableFetchResults == nil) { 
     NSLog(@"Fetching Error"); 
    } else { 
     [self setParentArray:mutableFetchResults]; 
     returnResult = TRUE; 
     NSLog(@"Fetching went well"); 
    } 

    [mutableFetchResults release]; 
    [fetchRequest release]; 

    return (returnResult); 
} 

好吧,首先,我想你在这里有一个概念性的问题,因为我从来没有见过有100个属性的实体的需要。大多数实体具有大约六分之一的属性,我认为我见过的最多的是大约20个。

核心数据首先是一个持久性对象图管理系统,作为选项提供。它旨在实现模型 - 视图 - 控制器(MVC)设计的模型层。因此,核心数据主要是关于模拟不存储数据的数据。

实体旨在表示一些真实世界的对象,条件或事件。没有很多现实世界的东西具有100个属性。例如。你想制作一个人的详细模型。你想要的东西,如名字,姓氏,地址(具有每个地址组件的属性),驾驶执照号码和发行日期,地址就业地点,社会安全号码等。如果您试图将所有内容整合为一个Person实体你最终可能会有几十个属性。然而,如果仔细观察你正在建模的数据和数据中的关系,你会注意到在现实世界中,地址,驾驶执照,工作地点等实际上并不是真实人物的属性,而是其他真实对象相关给真人。因此,最好的方法是将这些对象的属性分解为单独的实体并创建与Person实体的关系。这也使得模型更加真实。毕竟,不止一个人可以住在同一地址或在同一地点工作。

因此,您可能需要从头开始重新考虑您的数据模型设计。

确保您了解实体和managedObjects之间的区别。实体是抽象的,仅用于为managedObjects定义键,值类型和关系。由于类是实例,因此实体是managedObjects。

您还有其他两个问题:

(1)您只可以使用点语法访问形式e.g parentInfo.ParentToChild.Kid如果您为实体定义的自定义NSManagedObject子类。否则,您正在使用泛型NSManagedObject实例,并且必须使用键值方法,例如[parent setvalue:forKey]

(2)fetch只返回一个实体的对象。所以如果你有一个Parent实体和一个Child实体。每个提取都会返回父实例或子实例的实例,但不会同时发生(除非它们都从提取实体继承)。

+0

1st。感谢您花时间给出这样一个完整的答案。我同意,在这种情况下,关于“患者”的一切都是错误的方式。但是,当我尝试创建多个实体,例如将信息分解为相关一口大小的块时,我无法将数据保存到除一个实体外的所有实体。然而,你的评论(2)让我思考。我认为我只是在“家长”而不是其他人身上做一次,这可能是我的一个难题。 – 2011-03-12 05:29:49

+0

我很高兴能够重新使用我的模型,实际上,我们正努力争取如何一次将数据提取并保存到多个实体。再次感谢您的帮助。欢迎任何关于如何与多个实体交谈并写回的更多想法。 – 2011-03-12 05:34:55

+0

我不认为你赞赏关系的概念。关系允许您获取一个实体的对象,然后使用这些关系来访问相关实体的对象。例如。你有一个病人实体和一个像这样的医生实体病人医生。每个患者对象都有一位医生,但每位医生可能有很多患者。如果您想了解特定的患者医生,请取出该特定的患者对象,然后检查其Patient.doctor关系以找出有关医生的所有信息。等等。 – TechZen 2011-03-12 20:17:27