2011-08-11 24 views
0

我在本書的幫助下學習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 :)。然後我看到這個上下文指針的更新,並且有這樣一個問題:這是一種什麼規則,我應該採取相同的行動,還是僅僅不那麼簡潔的代碼示例?爲什麼我不能使用舊的指針?

---編輯---一個問題:是,這裏的請求的代碼的法律初始化:

兩個allocs只有一個版本?

回答

0

我也有這本書,並查找它。

顯然對我來說似乎是一個錯字,沒有多大意義。

只是忽略該行並繼續 - 它應該沒有工作正常。

+0

然後,我應該重新創建請求和結果數組?或者他們會用舊指針來罰款? – Matubo

+0

我剛剛從書籍網站下載了源代碼並刪除了這些行。它對應用程序沒有影響。這可能只是一個錯字。 –

+0

也沒有勘誤發佈在那本書上... http://www.apress.com/9781430233558 –

0

在我看來

its just not-so-neat code example

關於第二個問題:有也必須兩個版本!否則你有泄漏。

+0

是的,我傾向於這樣認爲。我的代碼有很多問題,但我認爲內存管理和編程的其他方面並不是本書的目的。核心數據問題沒有問題。 :) – Matubo

0

這是一些嚴重醜陋的代碼。

此:

的NSManagedObjectContext *上下文= [自managedObjectContext];

...可能只是因爲他們希望能夠在方法調用中寫入context而不是self.managedObjectContext

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

...允許兩次,但這是懶惰的不良做法。任何變量只能在範圍內命名一次。事實上,編譯器會用這段代碼產生一個警告。它會泄漏,因爲每個init必須由release進行平衡。

+0

謝謝。我也是這麼感覺的。 :) – Matubo