0

私は再び CoreData と戦っており、あなたの助けが必要です :P

RSSリーダーを書いています。デザインは、libxml2 ライブラリを使用した Apple TopSongs の例に基づいています。

アプリケーションが起動したら、最後の更新がいつだったかを確認しています。1 時間以上前の場合は、現在の永続ストアを削除して、すべてを再度ダウンロードします。

if ([[NSFileManager defaultManager] fileExistsAtPath:self.persistentStorePath]) {
        NSError *error = nil;
        BOOL oldStoreRemovalSuccess = [[NSFileManager defaultManager] removeItemAtPath:self.persistentStorePath error:&error];
        NSAssert3(oldStoreRemovalSuccess, @"Unhandled error adding persistent store in %s at line %d: %@", __FUNCTION__, __LINE__, [error localizedDescription]);
    }

ローカルの sql ファイルが削除されたことがわかります。

現在、バックグラウンドでフィードから情報をダウンロードするためにいくつかの NSOperations を作成しています。

これまでのところ、すべてがうまく機能しています。

すべての RSS フィードと同様に、変更を確認して coreData を更新する更新ボタンがあります。手始めに、すべてを削除してすべてを再ダウンロードすることにしました(効率的ではありませんが、RSSフィードにはGUIDがなく、変更があったかどうかを判断するためにハッシュ関数を実装する必要があります)。

だから私がやっていることは、基本的に上記と同じコードを呼び出してストアを削除することです..すべてのRSSフィードを再度ダウンロードします(アプリケーションが最初にロードされたときと同じロジック)

テーブルをリロードしていますが、tableView で同じデータを表示できますが、すべてが変更されていません。

さらに進んで、コンテンツをダウンロードせずにストアを削除することにしました。

if ([[NSFileManager defaultManager] fileExistsAtPath:app.persistentStorePath]) {
    NSError *error = nil;
    BOOL oldStoreRemovalSuccess = [[NSFileManager defaultManager] removeItemAtPath:app.persistentStorePath error:&error];
    NSAssert3(oldStoreRemovalSuccess, @"Unhandled error adding persistent store in %s at line %d: %@", __FUNCTION__, __LINE__, [error localizedDescription]);
}

    [self.managedObjectContext save:&err];
    [self.fetchedResultsController performFetch:&error];
    [self.tableView reloadData]

空のテーブルが表示されると思っていましたが、データはまだそこにありました。

これはどのように可能ですか?ストアを削除し、データを再取得してリロードしました。

私は何を間違っていますか?

4

2 に答える 2

1

あなたの問題はラインにあるかもしれないと思います

[self.managedObjectContext 保存:&err];

むしろ@Ladislavの提案に従ってください:

    NSFetchRequest * allObjectsRequest = [[NSFetchRequest alloc] init];
    [allObjectsRequest setEntity:[NSEntityDescription entityForName:@"Object" inManagedObjectContext:context]];
    [allObjectsRequest setIncludesPropertyValues:NO]; //only fetch the managedObjectID

    NSError * error = nil;
    NSArray * objects = [context executeFetchRequest:allObjectsRequest error:&error];
    [allObjectsRequest release];
    //error handling goes here
    for (NSManagedObject * object in objects) {
        [context deleteObject:object];
    }
    [context save:&error];
于 2011-03-01T10:23:34.567 に答える
1

ねえ、コア データ データベース全体を削除しないでください...ベース全体ではなく、コア データ データベースのすべてのエントリを削除してください。次の方法で Core Data データベースからオブジェクトを削除できます。

[context deleteObject:aCoreDataObject];

もう1つ...コアデータデータベースを変更すると、テーブルビューに反映されません。変更を確認したい場合は、たとえば呼び出す必要があります[tableView reloadData];

于 2011-03-01T10:15:02.323 に答える