Основные данные: хранилище не может хранить экземпляры объекта (ошибка какао: 134020)

Это самая странная ошибка. интернет предполагает, что это проблема с таргетингом на Tiger; за исключением того, что я на самом деле ориентируюсь на iOS 3 и 4.

Error Domain=NSCocoaErrorDomain Code=134020 "The operation couldn\u2019t be completed. (Cocoa error 134020.)" UserInfo=0xc502350 {NSAffectedObjectsErrorKey=<PartRecommendation: 0x6a113e0> (entity: PartRecommendation; id: 0x6a0d0e0 <x-coredata:///PartRecommendation/tAE2B5BA2-44FD-4B62-95D7-5B86EBD6830014> ; data: {
    "_rkManagedObjectSyncStatus" = 0;
    name = "Thin canopy cover";
    part = nil;
    partRecommendationId = 6;
    partType = "0x6a07f40 <x-coredata:///PartType/tAE2B5BA2-44FD-4B62-95D7-5B86EBD683003>";
}), NSUnderlyingException=Store <NSSQLCore: 0x5f3b4c0> cannot hold instances of entity (<NSEntityDescription: 0x6d2e5d0>) name PartRecommendation, managedObjectClassName PartRecommendation, renamingIdentifier PartRecommendation, isAbstract 0, superentity name PartOption, properties {
    "_rkManagedObjectSyncStatus" = "(<NSAttributeDescription: 0x6d37550>), name _rkManagedObjectSyncStatus, isOptional 0, isTransient 0, entity PartRecommendation, renamingIdentifier _rkManagedObjectSyncStatus, validation predicates (\n), warnings (\n), versionHashModifier (null), attributeType 100 , attributeValueClassName NSNumber, defaultValue 0";
    name = "(<NSAttributeDescription: 0x6d37c10>), name name, isOptional 1, isTransient 0, entity PartRecommendation, renamingIdentifier name, validation predicates (\n), warnings (\n), versionHashModifier (null), attributeType 700 , attributeValueClassName NSString, defaultValue (null)";
    part = "(<NSRelationshipDescription: 0x6d2e660>), name part, isOptional 1, isTransient 0, entity PartRecommendation, renamingIdentifier part, validation predicates (\n), warnings (\n), versionHashModifier (null), destination entity Part, inverseRelationship recommendation, minCount 1, maxCount 1";
    partRecommendationId = "(<NSAttributeDescription: 0x6d2e6d0>), name partRecommendationId, isOptional 1, isTransient 0, entity PartRecommendation, renamingIdentifier partRecommendationId, validation predicates (\n), warnings (\n), versionHashModifier (null), attributeType 100 , attributeValueClassName NSNumber, defaultValue 0";
    partType = "(<NSRelationshipDescription: 0x6d2e720>), name partType, isOptional 1, isTransient 0, entity PartRecommendation, renamingIdentifier partType, validation predicates (\n), warnings (\n), versionHashModifier (null), destination entity PartType, inverseRelationship partRecommendations, minCount 1, maxCount 1";
}, subentities {
}, userInfo {
}, versionHashModifier (null)}

Я добавляю много данных в Core Data, прежде чем получаю эту ошибку, но я сохраняю дважды (один раз в середине, а затем еще раз в конце). После первого сохранения все в порядке, проблема возникает при втором сохранении, поэтому я опубликую код, который использую после первого, но перед вторым.

Landscape *landscape = [Landscape object];

Type *type = [Type object];
type.name = @"tree";

MeasurementType *caliperType = [MeasurementType object];
MeasurementType *heightType = [MeasurementType object];

InventoryTree *inventoryTree = [InventoryTree object];
inventoryTree.landscape = landscape;
inventoryTree.type = type;

Assessment *assessmentTree = [Assessment object];
assessmentTree.inventoryItem = inventoryTree;
assessmentTree.type = type;
[[inventoryTree mutableSetValueForKeyPath:@"assessments"] addObject:assessmentTree];

Measurement *caliper = [Measurement object];
Measurement *height = [Measurement object];
caliper.type = caliperType;
height.type = heightType;
[[assessmentTree mutableSetValueForKey:@"measurements"] addObjectsFromArray:[NSArray arrayWithObjects:caliper, height, nil]];

for (PartType *pType in [PartType allObjects]) {
    pType.type = type;
        Part *treePart = [Part object];
        treePart.partType = pType;
        [[assessmentTree mutableSetValueForKey:@"parts"] addObject:treePart];
        for (PartCondition *cond in pType.partConditions) {
            cond.partType = pType;
        }
        for (PartRecommendation *rec in pType.partRecommendations) {
            rec.partType = pType;
        }
}

Удобные методы, которые я вызываю для подклассов NSManagedObject, можно найти здесь.

У меня есть методы в другом месте приложения (спустя долгое время после его запуска), которые могут добавлять/редактировать/удалять все объекты, упомянутые выше. Ошибка не возникает каждый раз в одном и том же объекте.

Любая помощь будет принята с благодарностью! Это сложно.


person Evan Cordell    schedule 04.08.2011    source источник


Ответы (3)


У меня была эта ошибка в следующей ситуации:

  • Я использую конфигурации в моей модели CoreData. Каждому объекту присваивается определенная конфигурация.
  • Я добавил новую сущность и забыл назначить ее одной из конфигураций.
  • Кажется, это вызывает ошибку Cocoa: 134020.

После добавления нового объекта в конфигурацию все работает нормально

person Frank Müller    schedule 23.07.2012

Для других людей, которые находят эту страницу через Google: у меня была аналогичная проблема с причиной, не связанной с решением выше.

Код, вызвавший ошибку, заполнял хранилище, в котором использовалась та же управляемая объектная модель, что и в существующем хранилище.

Неверный код был

NSManagedObject *newObj = [[NSManagedObject alloc] initWithEntity:[obj entity] insertIntoManagedObjectContext:moc]

Вместо этого сделайте

NSManagedObject *newObj = [[NSManagedObject alloc] initWithEntity:[NSEntityDescription entityForName:obj.entity.name inManagedObjectContext:moc] insertIntoManagedObjectContext:moc]

что может показаться излишним, но избавило меня от ошибки.

person mrueg    schedule 03.12.2012
comment
Спасибо, это помогло мне. Не похоже, что это исправит, но это исправило. Мое единственное предположение заключается в том, что в недрах Core Data есть ошибка по этому поводу. - person Andrew; 05.12.2012
comment
Спасибо за эту подсказку! - person Frank Hintsch; 14.07.2015
comment
Это исправило ошибку для меня в ios10 — новые методы инициализации (контекста) в NSManagedObject, похоже, не работают во время миграции. - person jrturton; 22.09.2016

Хорошо, я обнаружил, в чем проблема.

В коде перед тем, что я опубликовал, я использовал объект сеялки RestKit для заполнения моей базы данных из локального файла json, а затем продолжил добавлять объекты после его запуска. Но на самом деле он не фиксирует объекты в хранилище объектов, пока вы не вызовете finalizeSeedingAndExit.

Вызов этой функции для заполнения первой части моих данных, затем комментирование сеялки и повторный запуск исправили эту странную, странную ошибку.

person Evan Cordell    schedule 04.08.2011