核心数据保存和加载到多个实体
核心数据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实体。每个提取都会返回父实例或子实例的实例,但不会同时发生(除非它们都从提取实体继承)。
1st。感谢您花时间给出这样一个完整的答案。我同意,在这种情况下,关于“患者”的一切都是错误的方式。但是,当我尝试创建多个实体,例如将信息分解为相关一口大小的块时,我无法将数据保存到除一个实体外的所有实体。然而,你的评论(2)让我思考。我认为我只是在“家长”而不是其他人身上做一次,这可能是我的一个难题。 – 2011-03-12 05:29:49
我很高兴能够重新使用我的模型,实际上,我们正努力争取如何一次将数据提取并保存到多个实体。再次感谢您的帮助。欢迎任何关于如何与多个实体交谈并写回的更多想法。 – 2011-03-12 05:34:55
我不认为你赞赏关系的概念。关系允许您获取一个实体的对象,然后使用这些关系来访问相关实体的对象。例如。你有一个病人实体和一个像这样的医生实体病人医生。每个患者对象都有一位医生,但每位医生可能有很多患者。如果您想了解特定的患者医生,请取出该特定的患者对象,然后检查其Patient.doctor关系以找出有关医生的所有信息。等等。 – TechZen 2011-03-12 20:17:27