Шпаргалка по Core Data для Swift разработчиков на iOS

Если вы нашли опечатку в тексте, выделите ее и нажмите CTRL + ENTER.

Помните ли вы, как происходят основные операции в Core Data? Эта шпаргалка является удобной памяткой для того, чтобы вы с пользой владели Core Data и Swift!

Фрагменты кода, представленные ниже, помогут вам растормошить вашу память, если вы какое-то время не работали с Core Data. Также они могут быть полезными для начинающих разработчиков на iOS, Core Data, и Swift.

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

Запросы

Получение всех сущностей

// Предполагаем, что тип имеет ссылку на контекст

let fetchRequest = NSFetchRequest(entityName: "MyEntity")
do {
    let fetchedEntities = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [MyEntity]
    // что-либо делаем с fetchedEntities
} catch {
    // что-то делаем в зависимости от ошибки
}

Получаем N объектов сущности

// Предполагаем, что тип имеет ссылку на контекст

let fetchRequest = NSFetchRequest(entityName: "MyEntity")
fetchRequest.fetchLimit = 10
do {
    let fetchedEntities = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [MyEntity]
    // что-либо делаем с fetchedEntities
} catch {
    // что-то делаем в зависимости от ошибки
}   

Добавляем новую сущность

// Предполагаем, что тип имеет ссылку на контекст

let newEntity = NSEntityDescription.insertNewObjectForEntityForName("MyEntity", inManagedObjectContext: self.managedObjectContext) as! MyEntity
// устанавливаем свойства

do {
    try self.managedObjectContext.save()
} catch {
    // что-то делаем в зависимости от ошибки
}

Обновляем сущность

// Предполагаем, что тип имеет ссылку на контекст
 
// Предполагаем, что свойство objectIDFromNSManagedObject объекта NSManagedObject доступно
// Как вариант, вы можете выставить выражение предиката, 
// которое является достаточно точным, чтобы иметь возможность выбрать только одну сущность

let predicate = NSPredicate(format: "objectID == %@", objectIDFromNSManagedObject)
 
let fetchRequest = NSFetchRequest(entityName: "MyEntity")
fetchRequest.predicate = predicate
 
do {
    let fetchedEntities = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [MyEntity]
    fetchedEntities.first?.FirstPropertyToUpdate = NewValue
    fetchedEntities.first?.SecondPropertyToUpdate = NewValue
    // ... Обновляем новые свойства с новыми значениями
} catch {
    // что-то делаем в зависимости от ошибки
}
 
do {
    try self.managedObjectContext.save()
} catch {
    // что-то делаем в зависимости от ошибки
}

Обновляем сразу несколько сущностей

// Предполагаем, что тип имеет ссылку на контекст

let predicate = NSPredicate(format: "MyEntityAttribute == %@", "Matching Value")

let fetchRequest = NSFetchRequest(entityName: "MyEntity")
fetchRequest.predicate = predicate

do {
    let fetchedEntities = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [MyEntity]
    
    for entity in fetchedEntities {
        entity.FirstPropertyToUpdate = NewValue
        entity.SecondPropertyToUpdate = NewValue
    // ... Обновляем новые свойства с новыми значениями
    }
} catch {
    // что-то делаем в зависимости от ошибки
}

do {
    try self.managedObjectContext.save()
} catch {
    // что-то делаем в зависимости от ошибки
}

Удаляем сущность

// Предполагаем, что тип имеет ссылку на контекст

// Предполагаем, что свойство objectIDFromNSManagedObject объекта NSManagedObject доступно
// Как вариант, вы можете выставить выражение предиката, 
// которое является достаточно точным, чтобы иметь возможность выбрать только одну сущность
let predicate = NSPredicate(format: "objectID == %@", objectIDFromNSManagedObject)

let fetchRequest = NSFetchRequest(entityName: "MyEntity")
fetchRequest.predicate = predicate

do {
    let fetchedEntities = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [MyEntity]
    if let entityToDelete = fetchedEntities.first {
        self.managedObjectContext.deleteObject(entityToDelete)
    }
} catch {
    // что-то делаем в зависимости от ошибки
}

do {
    try self.managedObjectContext.save()
} catch {
    // что-то делаем в зависимости от ошибки
}

Удялаем несколько сущностей

// Предполагаем, что тип имеет ссылку на контекст

let predicate = NSPredicate(format: "MyEntityAttribute == %@", "Matching Value")

let fetchRequest = NSFetchRequest(entityName: "MyEntity")
fetchRequest.predicate = predicate

do {
    let fetchedEntities = try self.managedObjectContext.executeFetchRequest(fetchRequest) as! [MyEntity]
    
    for entity in fetchedEntities {
        self.managedObjectContext.deleteObject(entity)
    }
} catch {
    // что-то делаем в зависимости от ошибки
}

do {
    try self.managedObjectContext.save()
} catch {
    // что-то делаем в зависимости от ошибки
}

Урок подготовил: Акулов Иван

Источник урока