我有一個NSPersistentDocument子類使用我的數據的NSManagedObject子類。核心數據自動保存並不會加載自動保存後的所有數據
當打開一個新文檔時,我會對數據結構進行一些初始化(少量的填充字段)。我注意到Untitled文檔被自動保存,當應用程序重新打開時,該文檔被加載。如果應用程序退出,則用戶不會(默認情況下)獲得保存對話框的提示。如果窗戶關閉,用戶會這樣做。
第一個問題:
我想,當用戶退出應用程序調出保存對話框。我不希望這個無標題的文檔在正常情況下(通常情況下)。我希望它可以保存或刪除。
我試圖填寫:
- (void)applicationWillTerminate:(NSNotification *)aNotification
爲了觸發文檔進行保存。在此處調用會出現錯誤。據我所知,這是因爲用戶還沒有保存自己的文件。另外,撥打[self close];
或[[self windowForSheet] close];
關閉窗口而不保存。
如何強制保存對話框出現?我怎樣才能垃圾無標題的文件?
第二個問題(不,我不能指望):
由於應用程序啓動時,有可能會或可能不會是一個未命名的文件要處理,我試圖跟蹤國家在另一種模式。我已經發現,當無標題文件出現時,最初的數據(我前面提到過)存在。我的另一個模型有一些元數據,包括填充數據的成功標誌/狀態。一旦填充的數據全部到位並且正確,狀態就如此表示。不幸的是,當我的填充數據在應用程序以預先存在的無標題文檔開始時被加載時,元數據類不是。
請原諒代碼的粗糙度,在這一點上,我折騰吧,直到我可以看到它的工作我多麼希望之前,我把它擦亮後退:
- (bool) createGameState {
NSEntityDescription* description = [NSEntityDescription entityForName:[GameState name] inManagedObjectContext:[self managedObjectContext]];
NSFetchRequest* req = [[NSFetchRequest alloc] init];
[req setEntity:description];
NSError *error = nil;
NSArray *array = [[self managedObjectContext] executeFetchRequest:req error:&error];
[req release];
req = nil;
GameState* result = nil;
if (array) {
NSUInteger count = [array count];
if (!count) {
// Create the new GameState.
DebugLog(@"Creating GameState");
result = [NSEntityDescription insertNewObjectForEntityForName:[GameState name] inManagedObjectContext:[self managedObjectContext]];
[result setIsLoaded:[NSNumber numberWithBool:NO]];
} else {
if (count > 1) {
NSLog(@"WARNING: Potentially Corrupt Game State. found: %lu", count);
}
result = [array objectAtIndex:0];
if ([result isLoaded]) {
[self variantLoaded];
} else {
// In this case, we have an aborted set-up. Since the game isn't
// playable, just refuse to create the GameState. This will
// force the user to create a new game.
return NO;
}
}
} else {
DebugLog(@"error: %@", error);
}
[game setState:result];
return result;
}
注意數組總是存在,並且count總是零。不,我沒有明確地在任何地方撥打。我依靠標準的自動保存,或者用戶執行保存。
編輯:
我安裝了核心數據編輯器應用程序。事實證明,問題不在於保存數據,而在於加載數據。 (注意:由於另一個問題,應用程序保存爲二進制文件時指示保存爲XML,這會導致很多頭部撞擊)。
我已經將它分解爲最簡單的代碼,它應該拾取所有類型的對象GameState在一個數組中。 ,它檢索儘管沒有在保存文件的相應類型的存在顯然是對象:
NSManagedObjectContext* moc = [self managedObjectContext];
NSEntityDescription* entity = [NSEntityDescription entityForName:@"GameState" inManagedObjectContext:moc];
NSFetchRequest* req = [[NSFetchRequest alloc] init];
[req setEntity:entity];
NSError *error = nil;
NSArray *array = [moc executeFetchRequest:req error:&error];
數組不爲空,但[array count]
爲0
在這一點上,我猜這件事情簡單我忽略了。
第二個編輯:
我加入-com.apple.CoreData.SQLDebug 5
並保存爲SQLite的。對executeFetchRequest
的調用不會生成任何調試日誌。我確實看到日誌中顯示INSERT INTO ZGAMESTATE
條目。看起來executeFetchRequest
沒有傳遞到後端。
三EDIT(這個燒傷):
我創建了一個新的Xcode項目,採用核心數據(因爲我有與其他)。我只複製了這一個功能(必要時存根),並在windowControllerDidLoadNib
中撥打了一個電話。在這個新項目中,上面的代碼起作用。
引用的head-binging問題:http://stackoverflow.com/questions/9404962/coredata-not-setting-type-as-xml – 2012-03-06 22:15:58