Objective c 核心数据保存和加载到多个实体
这里没有核心数据 我有一个项目,它将数据保存到单个实体中,没有问题。但是,由于实体的属性太多(超过100个),它会收到一条警告,我需要对其进行规范化。好的,我创建了第二个实体来存储更多的数据,这种关系是双向的 问题是,当我尝试保存数据时,数据会保存并重新加载到第一个实体,但不会从第二个实体保存或重新加载。我一定错过了一些简单的东西 下面是一些代码:Objective c 核心数据保存和加载到多个实体,objective-c,core-data,entity,save,Objective C,Core Data,Entity,Save,这里没有核心数据 我有一个项目,它将数据保存到单个实体中,没有问题。但是,由于实体的属性太多(超过100个),它会收到一条警告,我需要对其进行规范化。好的,我创建了第二个实体来存储更多的数据,这种关系是双向的 问题是,当我尝试保存数据时,数据会保存并重新加载到第一个实体,但不会从第二个实体保存或重新加载。我一定错过了一些简单的东西 下面是一些代码: //ViewDidLoad - (void)viewDidLoad { if (managedObjectContext == ni
//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)让我思考。我想我只是在“父对象”上进行一次获取,而不是其他对象,这可能是我的问题之一。我很高兴重新构建我的模型,事实上,我想,只是努力研究如何一次将数据拉到多个实体并将其保存。再次感谢你的帮助。任何关于如何与多个实体交谈和回信的进一步想法都是受欢迎的。我认为你不理解关系的概念。关系允许您获取一个实体的对象,然后使用关系访问相关实体的对象。例如,您有一个患者实体和一个医生实体与此患者相关。通常只提取一个对象,然后使用它查找几十个或数百个与提取对象相关的其他对象。例如,患者实体可能具有护士、病史、当前图表、测量参考、过敏、保险等相互关系,以找到所有具有特定保险的患者,您可以获取特定的保险对象,然后查看其患者关系中的患者对象。要添加数据,只需颠倒过程即可。如果您有一个新患者,您可以创建一个新的患者对象,然后使用回迁查找现有的单个医生对象、护士对象、保险对象等,然后将这些对象添加到该特定患者对象的适当关系中。