Основные данные EXC_BAD_ACCESS при удалении - PullRequest
0 голосов
/ 01 ноября 2018

Получение EXC_BAD_ACCESS при удалении объектов из Core Data. Есть идеи как решить проблему? Может потребоваться некоторое прочтение основных принципов данных (?)

func deleteEntity(_ entity : String) {

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entity)

        print("Object count:  \(context.registeredObjects.count)") // prints 0 here
        do {
            let results = try context.fetch(fetchRequest)
            for managedObject in results {
                let managedObjectData : NSManagedObject = managedObject as! NSManagedObject
                if !managedObjectData.isDeleted{
                    context.delete(managedObjectData)  // EXC_BAD_ACCESS here, fetch request returns 1 item here!
                }
            }
            try context.save()
        } catch let error {
            print(error)
        }
    }




Crashed: com.apple.main-thread
0  CoreData                       0x1114c7293 -[NSManagedObjectContext(_NSInternalAdditions) _registerObject:withID:] + 35
1  CoreData                       0x1114c5569 -[NSManagedObjectContext(_NSInternalAdditions) _retainedObjectWithID:optionalHandler:withInlineStorage:] + 217
2  CoreData                       0x1114d0512 _PF_FulfillDeferredFault + 882
3  CoreData                       0x1114dfe9e _PF_Handler_Primitive_GetProperty + 110
4  CoreData                       0x1114dfca3 -[NSManagedObject(_NSInternalMethods) _newPropertiesForRetainedTypes:andCopiedTypes:preserveFaults:] + 323
5  CoreData                       0x1114dfb39 -[NSManagedObject(_NSInternalMethods) _newAllPropertiesWithRelationshipFaultsIntact__] + 89
6  CoreData                       0x1114dfa2b -[NSManagedObjectContext(_NSInternalChangeProcessing) _establishEventSnapshotsForObject:] + 75
7  CoreData                       0x1114f7168 -[NSManagedObjectContext deleteObject:] + 136

Редактировать: Кажется, что-то не так с контекстом. Я также пытался удалить весь магазин, но, кажется, один предмет остается, вызывая сбой. Этот конкретный элемент добавляется позже, в другом представлении. Может быть, это связано с отношениями. Отладка с помощью -com.apple.CoreData.ConcurrencyDebug 1 трассировка стека также показывает

"NSManagedObject может находиться только (или наблюдаться) в одном NSManagedObjectContext."

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Обычный способ удалить все объекты сущности -

func deleteEntity(_ entity : String) throws {
    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: entity)
    let results = try context.fetch(fetchRequest)
    for managedObject in results {
       context.delete(managedObject) 
    }

    try context.save()
}

Однако в iOS 9+, MacOS 10.11+ есть лучший способ

func deleteEntity(_ entity : String) throws {
    let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: entity)
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: request as! NSFetchRequest<NSFetchRequestResult>)
    let persistentStoreCoordinator = context.persistentStoreCoordinator!
    try persistentStoreCoordinator.execute(deleteRequest, with: context)

    try context.save()
}
0 голосов
/ 02 ноября 2018

Я вижу несколько проблем с вашим кодом ...

  • NSManagedObjectContext.registeredObjects.count будет подсчитывать все объекты в контексте всех сущностей. Это, вероятно, не то, что вы хотите (если только в вашей модели данных нет только одного объекта).
  • Я не вижу выхода из do{...}.
  • managedObjectData выглядит так же, как managedObject, за исключением того, что объявлено как не ноль, хотя на самом деле это может быть ноль. (Это, вероятно, причина аварии.)
  • Вы должны вызывать context.save() только один раз, после выхода из цикла.

Но вы все равно не должны использовать этот код. Вместо этого замените его одним из лучших способов удаления всех объектов данного объекта , как указано в ответах на этот вопрос .

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