0

マギアレコードで試してみることにしたコアデータベースのアプリがあります。(基本的に、MRは私が書いたヘルパークラスが行うことの多くを行うようです)

ただし、モデルに基づいてデータベースを作成しましたが、新しく挿入されたオブジェクトを使用してコンテキストを保存しようとすると、成功したように見えますが、データベースには何も作成されません。新しいオブジェクトが保存しようとしているコンテキストにあることを確認するためにステップスルーしました。保存するように指示します。エラーは作成されませんが、データはありません。私がここで見逃している明らかな何かがあると思います。

- (void)saveContext:(NSManagedObjectContext*)context withMessage:(NSString*)messageString
{
    NSError *error = nil;
    NSString *message = messageString;
    NSManagedObjectContext *managedObjectContext = nil;
    if (!context) {
        managedObjectContext = [NSManagedObjectContext defaultContext];
    } else {
        managedObjectContext = context;
    }
    if(!message) {
        message = @"Data Saved";
    }
    if ([managedObjectContext hasChanges]) {
        [managedObjectContext save:&error];
        if (error) {
            NSLog(@"Save Error: %@", [error localizedDescription]);
        }
        else {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Save Successful!"
                                                            message:message
                                                           delegate:nil
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
            [alert show];
        }
    }
}

何か洞察はありますか?前述したように、スタックがセットアップされていること(App DelegateのapplicationDidFinishLoadingメソッドでストアに名前を付けている)、および対応するデータベースが適切なテーブルとともに予期された場所に存在することを確認できます。予期された新しく挿入されたオブジェクトがmanagedObjectContextのinsertedObjectsに存在し、保存に起因するエラーがないことを確認できます。ただし、保存後、データはありません。(明らかに、managedObjectContextにもありません)

前もって感謝します。

4

2 に答える 2

1

実際にエンティティを保存している場所や、そのコードでエンティティに変更を加えている場所がわかりません。

また、注目に値するのは、そのコードで非常に多くの作業を行っていることです。あなたはおそらくもっと次のようなことをしたいと思うでしょう:

- (void) saveMyEntity:(NSObject<NSManagedObject *>) yourEntity;
{
    [MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext){

        yourEntity.message = @"something new";

    } completion:^{
        <UIAlert stuff here>
    }];
}

MagicalRecordは、データの保存方法などを覚えるという面倒な作業をかなり隠す、使いやすいAPIを提供します。READMEファイルを読むのはおそらく良いことです。

于 2012-10-08T23:04:58.550 に答える
0

OK、コードの何が問題だったのかはまだわかりませんが、NSManagedObjectContext の save メソッドを使用しないことはうまくいったようです。代わりに私はこれをしました:

- (void)saveContextWithMessage:(NSString*)messageString
{
    NSString *message = messageString;
    if (!message) {
        message = @"Data Saved";
    }
    [MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext* localContext){}
                                  completion:^{
                                  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Save Successful!"
                                                                                  message:message
                                                                                 delegate:nil
                                                                        cancelButtonTitle:@"OK"
                                                                        otherButtonTitles:nil];
                                  [alert show];
    }];
}

示されているように、私は MR が私のために行うことをコードで行っていたので、明確にするためにそれを削除しました。

于 2012-10-09T14:21:40.743 に答える