NSFetchedResultsController Удалить все - PullRequest
2 голосов
/ 10 апреля 2011

AcaniChat, как и родное приложение для iPhone-сообщений, имеет метод для очистки всех сообщений:

for (Message *message in [fetchedResultsController_ fetchedObjects]) {
    [managedObjectContext_ deleteObject:message];
}
if (![managedObjectContext_ save:&error]) {
    // TODO: Handle the error appropriately.
    NSLog(@"Delete message error %@, %@", error, [error userInfo]);
}

Но, только когда удаляется много сообщений (достаточно, чтобы некоторые из них были за кадром)AcaniChat вылетает с ошибками:

2011-04-10 01:06:17.629 AcaniChat[11129:207] Serious application error.  Exception was caught during Core Data change processing.  This is usually a bug within an observer of NSManagedObjectContextObjectsDidChangeNotification.  CoreData could not fulfill a fault for '0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42>' with userInfo {
    NSAffectedObjectsErrorKey =     (
        "<Message: 0x4d665b0> (entity: Message; id: 0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42> ; data: <fault>)"
    );
}
2011-04-10 01:06:17.721 AcaniChat[11129:207] Delete message error Error Domain=NSCocoaErrorDomain Code=133000 "The operation couldn’t be completed. (Cocoa error 133000.)" UserInfo=0x4d9cf70 {NSAffectedObjectsErrorKey=(
    "<Message: 0x4d665b0> (entity: Message; id: 0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42> ; data: <fault>)"
), NSUnderlyingException=CoreData could not fulfill a fault for '0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42>'}, {
    NSAffectedObjectsErrorKey =     (
        "<Message: 0x4d665b0> (entity: Message; id: 0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42> ; data: <fault>)"
    );
    NSUnderlyingException = "CoreData could not fulfill a fault for '0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42>'";
}
2011-04-10 01:06:18.036 AcaniChat[11129:207] CoreAnimation: ignoring exception: CoreData could not fulfill a fault for '0x4d7d050 <x-coredata://F07CAEF9-5F38-4A1F-BA17-52A3E2E56978/Message/p42>'

Как мне это исправить?

Ответы [ 2 ]

4 голосов
/ 10 апреля 2011

Я исправил это, установив fetchedResultsController_.delegate = nil, удалив все объекты в cellMap (который фактически является источником данных для UITableView *chatContent, потому что я добавляю NSDate объекты к cellMap для ячеек меток времени), изатем установите fetchedResultsController_.delegate = self и снова выполните запрос на выборку.

NSError *error;
fetchedResultsController.delegate = nil;               // turn off delegate callbacks
for (Message *message in [fetchedResultsController fetchedObjects]) {
    [managedObjectContext deleteObject:message];
}
if (![managedObjectContext save:&error]) {
    // TODO: Handle the error appropriately.
    NSLog(@"Delete message error %@, %@", error, [error userInfo]);
}
fetchedResultsController.delegate = self;              // reconnect after mass delete
if (![fetchedResultsController performFetch:&error]) { // resync controller
    // TODO: Handle the error appropriately.
    NSLog(@"fetchMessages error %@, %@", error, [error userInfo]);
}
[cellMap removeAllObjects];
[chatContent reloadData];
0 голосов
/ 12 июня 2011

Также проверьте MagicalRecord . У него есть метод +truncateAll.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...