0

管理対象オブジェクトコンテキストへの変更を保存するときにエラーが発生しますが、エラーハンドラに問題があります。エラーはゼロであるため、有用な情報が得られません。エラーハンドラには2つのバージョンがあります。これはXcodeによって生成され、機能します(つまり、ログメッセージに有用なエラー情報が含まれています)。

AppDelegate.c

- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil)
{
    if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error])
    {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    } 
}
}

しかし、成功/失敗(最終的には、今のところ中止しているだけです)+エラー情報を呼び出し元に返すことができるようにしたいので、これは機能しません(エラーはゼロであるため、有用ではありません)エラーに関する情報)。

Database.h

+ (BOOL) commit:(NSError **)error;

Database.c

+ (BOOL) commit:(NSError **)error {


AppDelegate *appDelegate = (AppDelegate*) [[UIApplication sharedApplication] delegate];
NSManagedObjectContext *managedObjectContext = appDelegate.managedObjectContext;

if (managedObjectContext != nil)
{
    if ([managedObjectContext hasChanges] && ![managedObjectContext save:error])
    {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
         */
        if (error == nil) {
            NSLog(@"Unresolved error");
            abort();
        } else {
            NSLog(@"Unresolved error %@, %@", *error, [*error userInfo]);
            abort();
            //return FALSE;
        }
    }
    return TRUE;
}
return FALSE;
}

私の問題はポインタにあり、リダイレクトのレイヤーで迷子になっていると確信しています。

[編集:] commitを呼び出すコード:

[Database commit:nil];

commitメソッドの先頭にこのようなものを追加する必要があるかどうか疑問に思いますが、ポインターについてはよくわかりません。

if (error == nil) {
    error = [[NSError alloc] init];
}
4

2 に答える 2

1

その2番目のバージョンでエラーのアドレスを渡す必要があると思いますか?

[managedObjectContext save:error]

する必要があります:

[managedObjectContext save:&error]

これにより、受信メソッドは、ポインター(ポインターが指している)が参照しているものを制御できます。

于 2012-12-14T20:27:06.393 に答える
1

commit:(コメントから)で呼び出された場合nil、これはおそらくエラーです。エラー変数のアドレスを使用して関数を呼び出す必要があります。

NSError *error = nil;
if (![Database commit:&error]) {
    // commit failed, "error" contains error message.
}

そしてもちろん、メソッド内のエラーの場合のreturn NO代わりに。abort()commit

commitメソッドにエラーメッセージを割り当てる必要はありません。[managedObjectContext save:error]保存が失敗した場合にそれを行います。

于 2012-12-14T21:26:25.020 に答える