2016-06-24 6 views
29

К сожалению, новая семантика Core Data делает меня сумасшедшим. У моего предыдущего вопроса был чистый код, который не работал из-за неправильной генерации файлов заголовков. Теперь я продолжаю работу с удалением объектов. Мой код выглядит очень просто:Swift 3 Основные данные Удалить объект

func deleteProfile(withID: Int) { 
    let fetchRequest: NSFetchRequest<Profile> = Profile.fetchRequest() 
    fetchRequest.predicate = Predicate.init(format: "profileID==\(withID)") 
    let object = try! context.fetch(fetchRequest) 
    context.delete(object) 
} 

Я сделал «жесткий» отладки с print(object) вместо context.delete(object), и он показал мне правильный объект. Мне нужно просто удалить его.

P.S. нет deleteObject. Теперь NSManagedContext имеет только public func delete(_ sender: AnyObject?)

+0

Если ситуация не изменится в Swift 3 (извинения, если у них есть), то запрос будет возвращать массив объектов, даже если есть только один, который соответствует вашим сказуемое. Для доступа к первому объекту в массиве вам нужно либо пройти через результаты (безопаснее), либо использовать 'object [0]'. – pbasdf

ответ

39

Результат выборки является массив управляемых объектов, в вашем случае [Event], так что вы можете перечислить массив и удалить все соответствующие объекты. Пример (с использованием try? вместо try!, чтобы избежать столкновения в случае из выборки ошибки):

if let result = try? context.fetch(fetchRequest) { 
    for object in result { 
     context.delete(object) 
    } 
} 

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


Примечание: В коде object имеет тип [Event] и поэтому в

context.delete(object) 

компилятор создает вызов метода NSObject

public func delete(_ sender: AnyObject?) 

вместо ожидается

public func delete(_ object: NSManagedObject) 

способ NSManagedObjectContext. Вот почему ваш код компилирует , но не работает во время выполнения.

+0

Благослови вас! Это помогло мне! – user3739902

+5

Не забудьте вызвать 'try context.save()', как указано в другом ответе. –

+0

Хорошее понимание тоже. – ScottyBlades

13

Удалить основные данные объекты скор 3

// MARK: Delete Data Records 

func deleteRecords() -> Void { 
    let moc = getContext() 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Person") 

    let result = try? moc.fetch(fetchRequest) 
     let resultData = result as! [Person] 

     for object in resultData { 
      moc.delete(object) 
     } 

     do { 
      try moc.save() 
      print("saved!") 
     } catch let error as NSError { 
      print("Could not save \(error), \(error.userInfo)") 
     } catch { 

     } 

} 

// MARK: Get Context 

func getContext() -> NSManagedObjectContext { 
    let appDelegate = UIApplication.shared.delegate as! AppDelegate 
    return appDelegate.persistentContainer.viewContext 
} 
+0

Что такое «Лицо» в нем –

+1

«Лицо» - это класс данных модели данных ядра –

22

[скор 3] Хитрость здесь, это сохранить контекст после удаления ваших объектов.

let fetchRequest: NSFetchRequest<Profile> = Profile.fetchRequest() 
fetchRequest.predicate = Predicate.init(format: "profileID==\(withID)") 
let object = try! context.fetch(fetchRequest) 
context.delete(object) 

do { 
    try context.save() // <- remember to put this :) 
} catch { 
    // Do something... fatalerror 
} 

Надеюсь, это может помочь кому-то.

+2

Это, безусловно, помогло мне, спасибо! –

+2

Ошибка при получении: - 'Невозможно преобразовать значение типа '[Entity]' в ожидаемый тип аргумента« NSManagedObject »в строке' context.delete (object) ' – amish

+0

@amish fetchRequest возвращает массив. Таким образом, var следует называть объектами. После того, как вы просто выполните цикл for (для объекта в объектах) и в цикле for вы можете удалить каждый объект – Sonius

0

Swift 4 без использования строки для Entity

let fetchRequest: NSFetchRequest<Profile> = Profile.fetchRequest() 
fetchRequest.predicate = Predicate.init(format: "profileID==\(withID)") 

do { 
    let objects = try context.fetch(fetchRequest) 
    for object in objects { 
     context.delete(object) 
    } 
    try context.save() 
} catch _ { 
    // error handling 
} 
Смежные вопросы