2009-08-12 6 views
6

Я разрабатываю приложение в какао. Я столкнулся с критической проблемой.«Основные данные не могут выполнить ошибку ..» ошибка

Я удаление записей объекта с именем «Каталог» в основных данных, используя следующий код:

NSEnumerator *tempDirectories = [[folderArrayController arrangedObjects] objectEnumerator]; 
id tempDirectory; 
while (tempDirectory = [tempDirectories nextObject]){ 
    [managedObjectContext deleteObject:tempDirectory]; 
} 

Но иногда исключение, как «Core Data не смог выполнить ошибку ..» происходит при попытке сохранить после удаления. Я использую код [managedObjectContext save];

Я новичок в Core Data ... С нетерпением жду решения.

+1

Посмотрите на третий абзац здесь: [Ошибка не может быть выполнена] (http://developer.apple.com/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html#//apple_ref/doc/uid/TP40002320- SW7) –

+0

Но как отлаживать и выяснить, какой именно модуль вызывает это исключение? –

ответ

4

Это старый вопрос, я боролся с этим в течение некоторого времени. Поэтому подумал, что было бы лучше документировать его.

As Weichsel вышеупомянутый, the Apple documentation справедливо указывает причина для этого исключения. Но это тяжелая задача определить модуль, из-за которого объект подкласса NSManagedObject сохраняется (если первая причина в документации является основной причиной проблемы).

Итак, я начал с определения частей моего кода, который сохранял NSManagedObject, вместо этого я сохранил NSManagedObjectID и создавал управляемый объект из него, когда это необходимо. Обсуждение в подобных линиях можно найти в Restkit документации:

  1. https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39
  2. https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605

Обновленные мой и присваиватель, чтобы интерфейс с остальными модулями остается таким же, а внутренне мы теперь зависим при NSManagedObjectID и избежать удержаний из NSManageObject:

-(CSTaskAbstract*)task 
{ 
    CSTaskAbstract *theTask = nil; 
    if (self.taskObjectID) 
    { 
     NSManagedObjectContext *moc = [(CSAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
     // https://github.com/RestKit/RestKit/commit/170060549f44ee5a822ac3e93668dad3b396dc39 & 
     // https://github.com/RestKit/RestKit/issues/611#issuecomment-4858605 
     NSError *theError = nil; 
     NSManagedObject *theObject = [moc existingObjectWithID:self.taskObjectID 
                 error:&theError]; 
     if ([theObject isKindOfClass:[CSTaskAbstract class]]) 
     { 
      theTask = (CSTaskAbstract*)theObject; 
     } 
    } 
    return theTask; 
} 
-(void)setTask:(CSTaskAbstract *)inTask 
{ 
    if (inTask!=self.task) 
    { 
     // Consequences of retaining a MO when it is detached from its MOC 
     [self setTaskObjectID:[inTask objectID]]; 
    } 
} 

выше являются первыми галами f проблемы решена. Нам нужно выяснить зависимость в подозрительных частях нашего приложения и устранить.

Была и другая проблема: инструменты -> распределения - хороший источник, чтобы выяснить, какие модули фактически сохраняют управляемые объекты, объект исключения будет иметь сведения о том, какой управляемый объект создает проблему, результаты фильтрации для этого объект, как показано ниже:

Instruments - Allocations

Мы выполняли КВО на управляемом объекте. KVO сохраняет наблюдаемый управляемый объект, и, следовательно, исключение выбрасывается, и его след назад не будет изнутри нашего проекта. Это очень сложно отлаживать, но угадать работу и отслеживать распределение объекта и цикл сохранения-освобождения наверняка помогут. Я удалил часть наблюдения KVO, и все это начало работать.

+0

+1 для ссылки на документ Apple – Martin

Смежные вопросы