CoreData
어렵더라..
아니 생각보단 괜찮은건가 여튼 CRUD까지는 괜찮더라
Core Data는 주로 크거나, 복잡한 관계를 가진 그런 유저의 데이터를 저장하는 데 쓰인다.
Core Data를 보면 저장하는데만 쓰이는 것은 아니다.
정의만 봐도 알 수 있듯 저장을 하기위한 UserDefaults와는 다르다.
얘는 클래스고, Default System에 접근할 수 있는 인터페이스를 제공한다. 그리고 접근해서 저장하고, 사용한다.
얘는 프레임워크다.
위 공식문서에 들어가면 알 수 있듯, 여러가지를 할 수 있는 프레임워크이다.
저장을 하든, 백업을 하든, 이전 상태로 되돌리든..
그 중 Persistence에 대해서 알아보려한다.
CRUD
우선 CRUD전에 초기셋팅은 해줘야 하니깐 초기셋팅부터 해보자
나는 프로젝트 생성시 CoreData를 체크해주지 않고 따로 생성해주었다.
이래 생성 후 이름은 뭐.. 난 UserModel로 해주었다.
이후 생성한 xcDataModeld 파일에 Entity를 만들어줘야한다.
Entity는 저장, 관리될 데이터의 집합을 의미한다.
그리고.. 인스펙터를 보면
난 Codegen을 달리해줬는데 이유는 난 공부하는 입장이니깐, 사용자가 알아서 하는 Manual/None을 택했다.
NSManagedObject를 만들어주질 않는다.
이것도 따로 만들어줘야함
그 전에 Entity의 Attribute를 만들어주자.
난 사용자 이름과, 전화번호를 저장할 것이다.
그 다음 NSManagedObject를 만들자
이렇게 생성해주면 우리가 만든 Entity(UserModel)를 관리해주는 클래스가 알아서 생성된다. NSManagedObject의 역할이다.
그럼 위처럼 NSManagedObject를 상속받은 클래스와, 프로퍼티들이 생겨났을 것이다.
그럼 이제.. 이 단계를 해줘야한다.
난 프로젝트 생성시 CoreData를 체크해주지 않았기때문에 따로 생성을 해줘야한다.
Persistant Container를 생성해보자
컨테이너는 아무데나 생성해도 된다. 처음에 코어데이터를 체크해주고 생성해줬으면 AppDelegate에 생성이 되있을 것이다.
나는 CoreDataManager라는 싱글톤 객체를 만들어 생성해주겠다.
import Foundation
import CoreData
class CoreDataManager {
private init() {}
static let shared: CoreDataManager = CoreDataManager()
lazy var persistentContainer: NSPersistentContainer = {
let container = NSPersistentContainer(name: "UserModel")
container.loadPersistentStores { description, error in
if let error = error {
fatalError("Unable to load persistent stores: \(error)")
}
}
return container
}()
}
NSPersistantContainer 인스턴스 생성시 name파라미터엔 아까 생성한 xcDataModeld 파일명을 적어주면 된다.
이 과정을 통해 우리가 만든 UserModel의 Container를 가져왔고, Container 내부의 Context를 가지고 managed Object를 생성하고, 저장, 관리, Fetch를 해줄 수 있게 됐다.
얘를 써먹는다는거임
그럴려면 우리가 만든 entity에 데이터를 저장해야 하므로 entity도 갖고와야겠지
그 전에 우리가 저장할 모델을 하나 만들자
struct Users {
let name: String
let number: String
}
이 모델의 프로퍼티를 각 entity에 저장하고, 해당 entity를 사용하여 object를 생성 및 값 저장을 해주면 된다.
func saveData() {
let viewContext = self.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "User", in: viewContext)
}
이제 저 entity를 가진 object를 생성해주자
func saveData(with users: Users) {
let viewContext = self.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "User", in: viewContext)
if let entity = entity {
let user = NSManagedObject(entity: entity, insertInto: viewContext)
}
}
object에 값을 셋팅해주자.
func saveData(with users: Users) {
let viewContext = self.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "User", in: viewContext)
guard let entity = entity else { return }
let user = NSManagedObject(entity: entity, insertInto: viewContext)
user.setValue(users.name, forKey: "name")
user.setValue(users.number, forKey: "number")
}
모델의 값을 셋팅하는 것인데, forKey에 들어간 문자열은 object에 넣어준 entity 값이다. 키-값 세팅을 해준 것임
그림으로 보면.. 위와 같다.
이제 object에 값 세팅까지 끝냈으니, NSManagedObjectContext를 저장해주면 된다.
func saveData(with users: Users) {
let viewContext = self.persistentContainer.viewContext
let entity = NSEntityDescription.entity(forEntityName: "User", in: viewContext)
guard let entity = entity else { return }
let user = NSManagedObject(entity: entity, insertInto: viewContext)
user.setValue(users.name, forKey: "name")
user.setValue(users.number, forKey: "number")
do {
try viewContext.save() // Save
} catch {
print(error)
}
}
저장해줬으니 확인을 해봐야겠지?
extension User {
@nonobjc public class func fetchRequest() -> NSFetchRequest<User> {
return NSFetchRequest<User>(entityName: "User")
}
@NSManaged public var name: String?
@NSManaged public var number: String?
}
데이터를 가져오는 함수는 처음에 NSManagedObject를 생성할 때 위처럼 생성되있으므로 호출해서 갖고오면 된다.
func fetchData() -> [User] {
let context = self.persistentContainer.viewContext
do {
let user = try context.fetch(User.fetchRequest())
return user
} catch {
fatalError("\(error)")
}
}
아직 저장안해봤는데.. 그냥 viewDidLoad에 넣어서 테스트해보겠당
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let jiseong = Users(name: "Jiseong", number: "010-1234-333")
let seongJi = Users(name: "SeongJi", number: "010-4321-333")
let girlFriend = Users(name: "unknown", number: "unknown")
CoreDataManager.shared.saveData(with: jiseong)
CoreDataManager.shared.saveData(with: seongJi)
CoreDataManager.shared.saveData(with: girlFriend)
}
@IBAction func didTapAddUserButton(_ sender: UIBarButtonItem) {
guard let destination = self.storyboard?.instantiateViewController(withIdentifier: "vc1") as? SecondaryViewController else {
return
}
let data = CoreDataManager.shared.fetchData()
data.forEach {
print($0)
}
self.navigationController?.present(destination, animated: true, completion: nil)
}
}
저장하고 불러온 코드다. 개판임
여튼 결과는
이거 2번 실행해서 2번 저장되버림,,, 완성~
CRUD중 CR 만했는데.. UD는 좀.. 쉬고 쓰련다.
'iOS > Swift' 카테고리의 다른 글
Swift) self vs Self (0) | 2022.02.20 |
---|---|
Swift) hitTest (0) | 2022.02.20 |
Swift) UIAlertController ActionSheet Programmatically (0) | 2022.02.20 |
Swift Performance (Allocation) (0) | 2022.02.20 |
Swift) final (0) | 2022.02.20 |
댓글