Mac Plus

Hello Swift

coredata 사용하기

  • 기존에 코드를 살펴보면 해당 coredata를 필요할때마다 매번 불러와서 사용하던데 손쉽게 사용하고, 수정도 용이하게 class형태로 만들어 보았다. !!
  • 기본적인 coreData를 프로젝트에 적용 했다고 하고, 데이터를 저장, 호출, 수정, 삭제 방법에 대해서 알아본다.
    1. 저장
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")
}
  1. 호출
    • 호출할때는 페이징 처리까지 고려해서 호출해준다.
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)
  }
}
  1. 수정
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
    }
}
  1. 삭제
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
    }
}