Pro Core Data book,示例代码问题

时间:2011-08-11 17:51:38

标签: ios core-data

我正在本书的帮助下学习核心数据。有一个代码:

- (void)loadData {
// Pull the movies. If we have 200, assume our db is set up.
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Movie"
                               inManagedObjectContext:context]];
NSArray *results = [context executeFetchRequest:request error:nil];
if ([results count] != 200) {
// Add 200 actors, movies, and studios
for (int i = 1; i <= 200; i++) {
[self insertObjectForName:@"Actor" withName:
                 [NSString stringWithFormat: @"Actor %d", i]];
[self insertObjectForName:@"Movie" withName:
                 [NSString stringWithFormat: @"Movie %d", i]];
[self insertObjectForName:@"Studio" withName:
                 [NSString stringWithFormat: @"Studio %d", i]];
}
// Relate all the actors and all the studios to all the movies
NSManagedObjectContext *context = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Movie"
                               inManagedObjectContext:context]];
NSArray *results = [context executeFetchRequest:request error:nil];
for (NSManagedObject *movie in results) {
[request setEntity:[NSEntityDescription entityForName:@"Actor"
                               inManagedObjectContext:context]];
NSArray *actors = [context executeFetchRequest:request error:nil];
NSMutableSet *set = [movie mutableSetValueForKey:@"actors"];
[set addObjectsFromArray:actors];
[request setEntity:[NSEntityDescription entityForName:@"Studio"
                               inManagedObjectContext:context]];
NSArray *studios = [context executeFetchRequest:request error:nil];
set = [movie mutableSetValueForKey:@"studios"];
[set addObjectsFromArray:studios];
}
}
[request release];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
}

主要问题是:如果上下文中有任何更改,是否有必要更新上下文指针? 我的意思是:我在方法的开头得到指向上下文的指针,然后在循环中我接受这个上下文并在那里插入托管对象(-insertObjectForName:withName :)。然后我看到这个上下文指针的更新并且有这个问题:它是某种规则,我应该采取相同的行动,或者它只是不那么整洁的代码示例?为什么我不能使用旧指针?

---编辑---还有一个问题:这是在代码中合法初始化请求:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
...
NSFetchRequest *request = [[NSFetchRequest alloc] init];
...
[request release];

两个分配,只有一个版本?

3 个答案:

答案 0 :(得分:0)

在我看来

  

它只是不那么整洁的代码示例

关于你的第二个问题:还有两个版本!否则你有泄漏。

答案 1 :(得分:0)

我也有这本书并且查了一下。

显然对我来说似乎是一个错字,并没有多大意义。

只需忽略该行并继续 - 它应该可以正常工作。

答案 2 :(得分:0)

这是一些非常难看的代码。

此:

NSManagedObjectContext * context = [self managedObjectContext];

...可能只是因为他们希望能够在方法调用而不是context中编写self.managedObjectContext

使用: NSFetchRequest * request = [[NSFetchRequest alloc] init];

......允许两次,但这是懒惰的不良做法。任何变量在范围内只应命名一次。实际上,编译器将使用此代码生成警告。它会泄漏,因为每个init必须由release平衡。