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

Objective c 核心数据保存和加载到多个实体,objective-c,core-data,entity,save,Objective C,Core Data,Entity,Save,这里没有核心数据 我有一个项目,它将数据保存到单个实体中,没有问题。但是,由于实体的属性太多(超过100个),它会收到一条警告,我需要对其进行规范化。好的,我创建了第二个实体来存储更多的数据,这种关系是双向的 问题是,当我尝试保存数据时,数据会保存并重新加载到第一个实体,但不会从第二个实体保存或重新加载。我一定错过了一些简单的东西 下面是一些代码: //ViewDidLoad - (void)viewDidLoad { if (managedObjectContext == ni

这里没有核心数据

我有一个项目,它将数据保存到单个实体中,没有问题。但是,由于实体的属性太多(超过100个),它会收到一条警告,我需要对其进行规范化。好的,我创建了第二个实体来存储更多的数据,这种关系是双向的

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

下面是一些代码:

//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实体的关系。这也使得模型更加真实。毕竟,不止一个人可以住在同一个地址或在同一个地方工作

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

确保您了解实体和managedObjects之间的区别。实体是抽象的,仅用于定义ManagedObject的键、值类型和关系。实体要管理对象,就像类要管理实例一样

您还有两个问题:

(1) 如果为实体定义了自定义NSManagedObject子类,则只能使用点语法访问器表单,例如
parentInfo.ParentToChild.Kid
。否则,您将使用通用NSManagedObject实例,并且必须使用键值方法,例如
[parent setvalue:forKey]


(2) 获取只返回一个实体的对象。因此,如果您有一个父实体和一个子实体。每个fetch都会返回父对象或子对象的实例,但不会同时返回两者(除非它们都继承自fetch的实体)。

1st。感谢您抽出时间给出如此完整的答案。我同意,在这种情况下,把“病人”的一切都死记硬背是错误的。然而,当我尝试创建多个实体时,比如将信息分解成相关的小块,我在将数据保存到除一个实体之外的所有实体时遇到了问题。然而,你的评论(2)让我思考。我想我只是在“父对象”上进行一次获取,而不是其他对象,这可能是我的问题之一。我很高兴重新构建我的模型,事实上,我想,只是努力研究如何一次将数据拉到多个实体并将其保存。再次感谢你的帮助。任何关于如何与多个实体交谈和回信的进一步想法都是受欢迎的。我认为你不理解关系的概念。关系允许您获取一个实体的对象,然后使用关系访问相关实体的对象。例如,您有一个患者实体和一个医生实体与此患者相关。通常只提取一个对象,然后使用它查找几十个或数百个与提取对象相关的其他对象。例如,患者实体可能具有护士、病史、当前图表、测量参考、过敏、保险等相互关系,以找到所有具有特定保险的患者,您可以获取特定的保险对象,然后查看其患者关系中的患者对象。要添加数据,只需颠倒过程即可。如果您有一个新患者,您可以创建一个新的患者对象,然后使用回迁查找现有的单个医生对象、护士对象、保险对象等,然后将这些对象添加到该特定患者对象的适当关系中。