- 기존에 코드를 살펴보면 해당 coredata를 필요할때마다 매번 불러와서 사용하던데 손쉽게 사용하고, 수정도 용이하게 class형태로 만들어 보았다. !!
- 기본적인 coreData를 프로젝트에 적용 했다고 하고, 데이터를 저장, 호출, 수정, 삭제 방법에 대해서 알아본다.
- 저장
let appDel: AppDelegate = (UIApplication.shared.delegate as! AppDelegate)
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity이름")
request.returnsObjectsAsFaults = false
let context: NSManagedObjectContext = appDel.managedObjectContext
//현재 날짜
let currentDate = getNowTimeString() // 현재날짜 가져오는 함수 (내꺼임)
let object = NSEntityDescription.insertNewObject(forEntityName: "Entity이름", into: context) as! (생성한 NSManagedObject)
object.setValue(title, forKey: "title")
object.setValue(url, forKey: "url")
object.setValue(image, forKey: "image")
object.setValue(currentDate, forKey: "date")
do {
try context.save()
} catch {
print("Failed saving")
}
- 호출
- 호출할때는 페이징 처리까지 고려해서 호출해준다.
func getCoreData(_ offset: Int) -> ([Any]?, Bool) {
var value: Bool = false
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity이름")
request.returnsObjectsAsFaults = false
request.fetchLimit = limit
if count - offset <= 0 { //count는 총 data갯수, offset은 페이징 처리 갯수
request.fetchOffset = 0
if count % limit != 0 {
request.fetchLimit = count % limit
}
value = false
} else {
request.fetchOffset = count - offset
value = true
}
do {
let results = try context.fetch(request) as NSArray
let sort: NSSortDescriptor = NSSortDescriptor.init(key: "data", ascending: false) //data날짜를 기준으로 정렬하여 가져온다.
let sortedResults: Array = results.sortedArray(using: [sort])
return (sortedResults, value) //페이징 처리시에 데이터가 더 없으면 false값을 return시켜주고 더이상 데이터를 불러오지 않도록 처리해준다.
} catch {
return (nil, false)
}
}
- 수정
func modifyCoreData(_ title: String, _ date: String) -> Bool { //title이 수정할 내용, date가 primary key로 사용되었다.
let entity = NSEntityDescription.entity(forEntityName: "Entity이름", in: context)
let request = NSFetchRequest<NSFetchRequestResult>()
request.returnsObjectsAsFaults = false
request.entity = entity
let predicate = NSPredicate(format: "(date = %@)", date)
request.predicate = predicate
do {
let results = try context.fetch(request)
let objectUpdate = results[0] as! NSManagedObject
objectUpdate.setValue(title, forKey: "title") //키값에 해당하는 값을 변경해준다.
do {
try context.save()
return true
}catch let error as NSError {
return false
}
}
catch let error as NSError {
return false
}
}
- 삭제
func deleteCoreData(_ index: Int) -> Bool { //해당 index를 받아와서 context에서 삭제시켜준다.
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Entity이름")
request.returnsObjectsAsFaults = false
let results = try! context.fetch(request) as NSArray
let sort: NSSortDescriptor = NSSortDescriptor.init(key: "date", ascending: false)
let sortedResults: Array = results.sortedArray(using: [sort])
context.delete(sortedResults[index] as! NSManagedObject)
do {
try context.save()
return true
} catch let error as NSError {
print(error)
return false
}
}