0

私はiPhoneアプリにCoreDataを追加する作業をしていて、いくつかの非常に苛立たしい問題に直面しています。コンテキストでsaveを呼び出すと、saveは正常に返されますが、データベースにデータが追加されていません(これをシミュレーターで実行し、SQLITEファイルを調べて確認しています)。

この投稿MYDocumentHandlerクラスを使用して、複数のクラスにまたがる単一のクラスを使用しています。私は次のようにコードを実行します:UIManagedDocumentAppDelegate

if (!self.document) {
    [[MYDocumentHandler sharedDocumentHandler] performWithDocument:^(UIManagedDocument *document) {
        self.document = document;
        self.context = document.managedObjectContext;
        [self loadView];
    }];
}

ドキュメントが返されると、このloadViewメソッドはViewControllerをセットアップします。Core Dataを使用するViewControllerでは、次のようなものを使用します。

- (void)viewDidLoad
{
    [super viewDidLoad];

    if(!self.document){
        [[MYDocumentHandler sharedDocumentHandler] performWithDocument:^(UIManagedDocument *document) {
            self.document = document;
            self.context = document.managedObjectContext;
            [self loadAll];
        }];
    }


}

loadAllメソッドがビューのすべてをセットアップする場所。データを保存しようとすると、次のものを使用します。

for (int i = 0; i < [jsonArray count]; i++) {
                    NSDictionary *dictionary = [jsonArray objectAtIndex:i];
                    ProjectObject *tempProject = [[ProjectObject alloc] initWithDict:dictionary andETag:etag];
                    [tempAllProjects addObject:[Projects newProject:tempProject withContext:self.context]];
                    [tempProject release];
                }


                [self saveWithContext:self.context];

私のsaveWithContext方法は次のようになります。

- (BOOL) saveWithContext:(NSManagedObjectContext *)context{
    NSError *error = nil;

    if (context != nil) {
        if ([context hasChanges] && ![context save:&error]) {
            DLog(@"Unresolved error %@, %@", error, [error userInfo]);
        } else{
            DLog(@"save was successful");
            return YES;
        }
    }else{
        DLog(@"context is nil");
        return NO;
    }
}

私は常にsave was successfulメッセージを受け取り、MYDocumentHandlerファイルから適切なメッセージを受け取ります。残念ながら、データは単にデータベースに到達していません。データは確実にコンテキストに保存されますが、データベースには送信されません。何か案は?

編集: これが私がエンティティを作成するコードです:

+ (Projects *) newProject:(ProjectObject *)project withContext:(NSManagedObjectContext *)context
{
    Projects *newProject = nil;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Projects"];
    request.predicate = [NSPredicate predicateWithFormat:@"project_id = %@", project.project_id];
    NSArray *results = [context executeFetchRequest:request error:nil];

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if([results count] > 0){
        newProject = [results objectAtIndex:0];
        newProject.account_id = [NSString stringWithFormat:@"%@", [defaults objectForKey:@"account_id"]];

    } else {
        newProject = [NSEntityDescription insertNewObjectForEntityForName:@"Projects" inManagedObjectContext:context];
    }

    newProject.account_id = [NSString stringWithFormat:@"%@", [defaults objectForKey:@"account_id"]];
    newProject.project_id = project.project_id;
    newProject.name = project.name;
    newProject.project_description = project.description;
    newProject.updated_at = project.updated_at;
    newProject.starred = project.starred;
    newProject.etag = project.etag;

    newProject.synced = [self hasConnection] ? [NSNumber numberWithInt:1] : [NSNumber numberWithInt:0];
    return newProject;
}
4

2 に答える 2

1

私はこの投稿で解決策を見つけました。これがそれを処理するための最良の方法であるかどうかはわかりません。より良いオプションがあれば、私に知らせてください。

于 2012-10-25T14:39:50.230 に答える
0

変更後に管理オブジェクトコンテキストを保存していません。コードに行を追加しました。今動作するか確認してください。

于 2012-10-25T14:27:26.417 に答える