データにNSManagedObjectサブクラスを使用するNSPersistentDocumentサブクラスがあります。CoreData自動保存して自動保存後にすべてのデータをロードしない
新しい文書を開くと、データ構造の初期化が行われます(フィールドにデータを取り込むことはほとんどありません)。私が気づいたのは、無題のドキュメントが自動的に保存され、アプリケーションが再び開くとそのドキュメントが読み込まれるということです。アプリケーションが終了すると、ユーザーは(デフォルトでは)保存ダイアログを表示しません。ウィンドウが閉じると、ユーザーは実行します。
最初の質問:
私は、ユーザーがアプリケーションを終了するときに保存ダイアログを呼び出したいです。私はこの無題文書が(通常の状況下では)ぶら下がっているのを望まない。私はそれを救いたい、あるいはゴミ箱に入れたい。
私が記入しようとした:
- (void)applicationWillTerminate:(NSNotification *)aNotification
保存すべき文書をトリガするために。この時点でコンテキスト上でを呼び出すとエラーが発生します。私が知る限り、これはユーザーがまだファイルを自分で保存していないためです。さらに、[self close];
または[[self windowForSheet] close];
を呼び出すと、保存せずにウィンドウが閉じます。
保存ダイアログを表示させるにはどうすればよいですか?無題のドキュメントを削除するにはどうすればよいですか?
2番目の質問(いいえ、私は数えることができない):
アプリケーションの起動時、または私は状態を追跡しようとしている、に対処するための無題のドキュメントがあってもなくてもよいので、別のモデル。私は既に、Untitledの文書が出てきたときに最初のデータ(前に参照したもの)が存在することを発見しました。私の他のモデルは、人口統計データの成功フラグ/状態を含むいくつかのメタデータを持っています。ポピュレートされたデータがすべて正しい位置にあり、正しい場合、状態はそのように表示されます。残念ながら、既存の無題のドキュメントでアプリが起動したときにデータが読み込まれている間、メタデータクラスは読み込まれません。
- (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;
}
なお、配列は次のとおりです。
この時点でコードの粗さを、言い訳してください、私は私がバックオフそれを磨く前に、私が欲しいどのように働いていることを確認できるまで、それをいじくるです常に存在し、カウントは常にゼロです。いいえ、私は明示的にと呼んでいません。私は、標準の自動保存、または保存を実行しているユーザーに頼っています。
編集:
Core Data Editorアプリがインストールされています。問題はデータの保存ではなく、読み込み時に発生することが判明しました。 (注:別の問題が原因で、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];
配列がnullではありませんが、[array count]
はこの時点で0
ですが、私はそれは単純なものだ推測している:それは明らかに保存されたファイルに適切な型のオブジェクトそこにいるにもかかわらず、何を取得していません私は見落としている。
第二EDIT:
私は-com.apple.CoreData.SQLDebug 5
を追加し、SQLiteのとして保存します。 executeFetchRequest
を呼び出すと、デバッグログは生成されません。ログにINSERT INTO ZGAMESTATE
のエントリが表示されています。 executeFetchRequest
がバックエンドに渡されていないようです。
サードEDIT(この1つは燃える):
私は(私は他に持っていたとして)コアデータを使用して、新しいXcodeプロジェクトを作成しました。私はちょうどこの1つの機能(必要に応じてスタブ)をコピーし、windowControllerDidLoadNib
に電話をかけました。この新しいプロジェクトでは、上のコードが機能します。
参照されたヘッドバンギングの問題:http://stackoverflow.com/questions/9404962/coredata-not-setting-type-as-xml –