0

私はこの fetchedResult メソッドを持っています:

- (NSFetchedResultsController *)fetchedResultsController
{
    if (__fetchedResultsController != nil) {
        return __fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Cards" inManagedObjectContext:self.managedObjectContext];
    [fetchRequest setEntity:entity];

    [fetchRequest setFetchBatchSize:20];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Cards" ascending:YES];
    NSArray *sortDescriptors = [NSArray arrayWithObjects:sortDescriptor, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"];
    aFetchedResultsController.delegate = self;
    self.fetchedResultsController = aFetchedResultsController;

    NSError *error = nil;

    if (![self.fetchedResultsController performFetch:&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();
    }

    return __fetchedResultsController;
}

しかし、私がそれを要求するself.fetchedResultsController.fetchedObjects.countと、必要以上に 1 つ多くのアイテムが返されます。最初の項目は常にこれです。"<Cards: 0x83e9c50> (entity: Cards; id: 0x83e9c80 <x-coredata:///Cards/t8C371600-7875-468C-A529-C918F0008C384> ; data: {\n cardID = nil;\n favourite = 0;\n imageData = nil;\n})"しかし、ターミナル経由で sqlite をチェックすると、この項目が存在しないことがわかります。それが何であるかについて何か考えはありますか?

4

1 に答える 1

0

何が起こっているのか理解するのは難しいです。あなたのコードは私には良さそうです。しかし、キャッシュ メカニズムを使用すると、これは奇妙な動作になる可能性があります。

テストするnilには、キャッシュの代わりに使用するNSFetchedResultsControllerか、最初にキャッシュを削除してからリクエストを実行してください。

+ (void)deleteCacheWithName:(NSString *)name

あなたがnilすべての現金を渡す場合は、削除されます。

修正したらお知らせください。

PS内部では、現金が保存され、さまざまなアプリのスタートアップ間で共存できると思います。誰もこれについて知っていますか?

于 2012-06-16T14:12:49.743 に答える