CoreData๋ฅผ ํ์ฉํด์ ์์ ํ๋ก์ ํธ๋ฅผ ํ๋ ๋ง๋ค์ด์ ์ฐ์ตํด๋ณผ๊นํฉ๋๋ค!
< ์ฐ์ต ํ๋ก์ ํธ >
์ด๋ฆ, ์ฑ๋ณ, ๋์ด๋ฅผ ์
๋ ฅํ ํ
์ ์ฅ ๋ฒํผ์ ๋๋ฅด๋ฉด, CoreData์ ์ ์ฅ๋๊ณ
์ ์ฒด์ญ์ ๋ฅผ ๋๋ฅด๋ฉด ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.
โ ํ๋ก์ ํธ ์์ฑ
์ฐ์ ํ๋ก์ ํธ๋ฅผ ํ๋ ์์ฑํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ๋จ์ CoreData๋ฅผ ์ ํํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์์ ๊ฐ์ด xcdatamodeld ํ์ผ์ด ์๋ ์์ฑ๋ฉ๋๋ค.
๋ง์ฝ์ ํ๋ก์ ํธ๋ฅผ ์งํ์ค์ CoreData๋ฅผ ์ถ๊ฐํด์ผํ๋ค๋ฉด?

Command + N ์ผ๋ก ๋ฐ์ดํฐ ๋ชจ๋ธ ํ์ผ์ ์ถ๊ฐํ๋ฉด ๋ฉ๋๋ค.
โก Entity, Attributes, Relationships ์ค์
์ด์ ํ๋จ Add Entity๋ฅผ ํด๋ฆญํด์ Entity๋ฅผ ์ถ๊ฐํฉ๋๋ค.
์ฌ๊ธฐ์ Entity์ด๋ฆ์ ์ค์ํ๋๊น ์ ๊ธฐ์ตํ๊ธฐ!
(์ ๋ Testํ๋ก์ ํธ๋ผ ์ ์ด๋ฆ Yegr๋ผ๊ณ ์ง์์ต๋๋ค :D)
๊ทธ๋ฆฌ๊ณ + ๋ฒํผ์ผ๋ก Attributes ์ถ๊ฐํฉ๋๋ค. (๊ฐ์ฒด ์ด๋ฆ, ํ์
์ค์ )
์ด ๋ถ๋ถ์ ์ ์ฅํ ๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๋ค๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก ํ์
์ ์ต์
๋๋ก ๋ง๋ค์ด์ง๋๋ฐ,
์ฐ์ธก ์๋จ ์ธ์คํํฐ ์์ญ์ ํตํด ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
๋ค์์ผ๋ก Entity์ Class ํ๋จ์ ์๋ Codegen์ ๋ํด์ ์ ๋ฆฌํ๋ฉด,
์ด๋ ๊ฒ! ์ํฉ์ ๋ง๊ฒ ์ค์ ํด์ฃผ์๋ฉด ๋ฉ๋๋ค!
NSManagedObject Subclass ์์ฑ ๋ฐฉ๋ฒ
์ ๊ฐ ์ด์ ์ CoreData๋ฅผ Attributes๊ฐ ์ถ๊ฐ์ ์ผ๋ก ํ์ํด์
์ค๊ฐ์ ํ๋๋ฅผ ๋ ์ถ๊ฐํ์ ์ด ์๋๋ฐ,
๋ถ๋ช
Double? ํ์
์ผ๋ก ๋ง๋ค์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ
์ฌ์ฉํ๋ ค๊ณ ํ๋ฉด ์ปดํ์ผ์์ Double ํ์
์ผ๋ก ์ธ์๋๋ ๋ฌธ์ ๊ฐ ์์์ต๋๋ค.๐คฏ
๊ทธ๋์ Subclass ์์ฑํด์ ํ์
์ ์๋์ผ๋ก ๋ณ๊ฒฝํด์คฌ์ต๋๋ค.

์๋จ Editor์์ Create NSManagedObject Subclass๋ฅผ ์ ํํด์ค๋๋ค.

๊ทธ๋ผ ์ด๋ ๊ฒ ํ์ผ ๋๊ฐ๊ฐ ์์ฑ๋ฉ๋๋ค.
๊ณต์ ๋ฌธ์๋ฅผ ์ดํด๋ณด๋ฉด,
https://developer.apple.com/documentation/coredata/modeling_data/generating_code
Generating code | Apple Developer Documentation
Automatically or manually generate managed object subclasses from entities.
developer.apple.com

CoreData๋ Entities, Attriubtes ๋ฐ relationships์ ์ ์ํ ํ,
Entity ์ธ์คํด์ค๋ฅผ ๋ง๋๋๋ฐ ์ฌ์ฉํ ํด๋์ค๋ฅผ ์ง์ ํฉ๋๋ค.
CoreData๋ ์ ํ์ ์ผ๋ก ํด๋์ค ํ์ผ๊ณผ ์์ฑ ํ์ผ์ด๋ผ๋ ๋ ๊ฐ์ ํ์ผ์ ์์ฑํฉ๋๋ค.
ํด๋์ค ํ์ผ์ ํด๋์ค๋ฅผ NSManagedObject์ ํ์ ํด๋์ค๋ก ์ ์ธํฉ๋๋ค.
์์ฑ ํ์ผ์ attributes, relationships, ํด๋น ์ ๊ทผ์ ๋ฐ ์ด ์ ํ์ ์ธ์คํด์ค๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๋์์ ์ฃผ๋
@NSManaged ์์ฑ์ ๊ฐ์ง extension์ผ๋ก ์ ์ธํฉ๋๋ค.
๊ด๋ฆฌ๋๋ ๊ฐ์ฒด ์๋ธํด๋์ค ์์ฑ์ CoreData๊ฐ ์ฒ๋ฆฌํ์ง๋ง,
๋ก์ง์ ์ถ๊ฐํ๊ฑฐ๋ ์์ฑ์ ํธ์งํด์ผ ํ ๋๋ ์ฌ์ฉ์๊ฐ ์ง์ ์ ์ดํ ์ ์์ต๋๋ค.
๋ค.. ์ด๋ ๋ต๋๋ค.
์ํฉ์ ๋ฐ๋ผ ๋ฐ๋ก ์์ Codegen์ ๋ํด ์ ๋ฆฌํ๋๋๋ก
ํด๋์ค ์ ์๋ฅผ ์ ํํ ์ ์๋ค๋ ๋ง์ธ ๊ฒ ๊ฐ์์.
๊ทธ๋ฆฌ๊ณ Create NSManagedObject Subclass๋ฅผ ํตํด ํ์ผ์ ์์ฑํ๋ฉด,
์ ํ์ผ์ ํด๋น ์์น์ ๊ธฐ์กด ํ์ผ์ ๋ฎ์ด ์ด๋ค๋๋ ์ ์ ์ ์ํ๋ผ๊ณ ์ ํ์์ต๋๋ค!
CoreData Subclass์ Double? ํ์ ์ด ์ ์ธ์ด ์๋๋ ๊ฒฝ์ฐ
Double? ํ์
์ผ๋ก ์ ์ธํ๋ ค๊ณ ๋ณด๋,
'Property cannot be marked @NSManaged because its type cannot be represented in Objective-C'
์ด๋ฐ ์๋ฌ ๋ฌธ๊ตฌ๊ฐ ๋จ๋๋ผ๊ณ ์..๐ง
์์๋ณด๋,
CoreData๋ ๊ธฐ๋ณธ์ ์ผ๋ก Objective-C์ ํจ๊ป ๊ฐ๋ฐ๋ ํ๋ ์์ํฌ๋ผ์
Swift์์ ์ฌ์ฉํ๋๋ผ๋ ์ผ๋ถ Objective-C ํน์ฑ์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํฉ๋๋ค.
Objective-C๋ Double์ด๋ผ๋ ํ์
์ ๊ฐ์ง๊ณ ์์ง ์๊ณ ,
๋์ ์ NSNumber ํ์
์ ๊ฐ์ง๊ณ ์๋ค๊ณ ํด์.
(Double ํ์
๋ง๊ณ ๋ ์ง์ํ์ง ์๋ ํ์
์ด ์๋ค๊ณ ํด์.
์ฌ์ฉ ์, CoreData์์ ์ง์ํ์ง ์๋ ํ์
๋ค์ ์ฐพ์๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค!)
extension Yegr {
@nonobjc class func fetchRequest() -> NSFetchRequest<Yegr> {
return NSFetchRequest<Yegr>(entityName: "Yegr")
}
@NSManaged var aspectRatioValue: NSNumber?
var aspectRatio: Double? {
get {
aspectRatioValue?.doubleValue
}
set {
aspectRatioValue = newValue as NSNumber?
}
}
}
๊ทธ๋์ ์์ ๊ฐ์ด Double? ํ์
์ด ์๋ NSNumber? ํ์
์ผ๋ก ์ ์ธํ๊ณ ,
Swift์ ๋ง๊ฒ ๊ณ์ฐ ํ๋กํผํฐ๋ฅผ ํตํด ํ์
์ ๋ณํํ์ฌ Double? ํ์
์ ์ฌ์ฉํ ์ ์๋๋ก ํ์์ต๋๋ค. ๐
โข PersistentContainer ์ค์
Entity, Attributes, Relationships ๋ฑ ํ์ํ ์ค์ ์ด ๋๋ธ ํ,
AppDelegate์์ ๊ด๋ฆฌํ๋ persistentContainer๋ฅผ ๊ฐ์ ธ์ฌ๊ฒ๋๋ค!
(persistentContainer๋ CoreData์ ๋ฐ์ดํฐ ์คํ์ ๊ด๋ฆฌํ๋ ๊ฐ์ฒด์ด๊ณ ,
์ด ๊ฐ์ฒด๋ฅผ ํตํด์ CoreData์ NSManagedObjectContext์ ์ ๊ทผํ ์ ์์ต๋๋ค.)
private func configurePersistentContainer() {
let appDelegate = UIApplication.shared.delegate as! AppDelegate
self.container = appDelegate.persistentContainer
}
์ด ์ฝ๋๋ฅผ ํตํด์ AppDelegate์์ ์ด๊ธฐํํ persistentContainer๋ฅผ ๋ทฐ์ปจ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค!
(์ฐธ๊ณ ๋ก NSManagedObjectContext๋ CoreData ๊ฐ์ฒด๋ฅผ ๋ค๋ฃจ๊ณ , ๋ฐ์ดํฐ ์ถ๊ฐ, ์์ , ์ญ์ ์์
์ ์ํํ๋ ๊ฐ์ฒด์
๋๋ค.)
โฃ ๋ฐ์ดํฐ ์์ฑ (Create)
์ฒ์์ Entity ์ค์ ํ ๋, ์ด๋ฆ ๊ผญ ๊ธฐ์ตํ๋ผ๊ณ ํ๋๊ฑฐ ๊ธฐ์ตํ์์ฃ ?
๊ทธ ์ด๋ฆ์ EntityName์ ๋ฃ์ด ํด๋น Entity๋ฅผ ๊ฐ์ ธ์ค๊ณ , NSManagedObject๋ฅผ ์ฌ์ฉํด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ ๊ฒ๋๋ค.
private func createEntity(name: String, gender: String, age: Int) {
if let entity = NSEntityDescription.entity(forEntityName: "Yegr", in: self.container.viewContext) {
let object = NSManagedObject(entity: entity, insertInto: self.container.viewContext)
object.setValue(name, forKey: "name")
object.setValue(gender, forKey: "gender")
object.setValue(age, forKey: "age")
}
saveData() // ์ด ๋ฉ์๋๋ ๋ค์ ์ค๋ช
์ ์์ต๋๋ค.
}
NSEntityDescription.entity(forEntityName: in:)๋ก "Yegr" ์ํฐํฐ๋ฅผ ๊ฐ์ ธ์ค๊ณ ,
NSManagedObject๋ฅผ ์ฌ์ฉํด์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์์ฑํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ setValue(forKey:) ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ ํ
์คํธ ํ๋์์ ๋ฐ์ ๋ฐ์ดํฐ๋ฅผ ํด๋น ๊ฐ์ฒด์ ์์ฑ์ ์ค์ ํด์คฌ์ต๋๋ค.
(์ ๋ '์ ์ฅ'๋ฒํผ์ ํด๋ฆญํ์ ๋, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ถ์ด์ ๋ฃ์ด์ค ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์คฌ์ต๋๋ค.)
โค ๋ฐ์ดํฐ ์ ์ฅ(Save)
container.viewContext.save()๋ฅผ ํธ์ถํด์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅ์์ ์ ์ฅํฉ๋๋ค.
private func saveData() {
do {
try self.container.viewContext.save()
} catch {
print("error!: \(error.localizedDescription)")
}
}
โฅ ๋ฐ์ดํฐ ๋ถ๋ฌ์ค๊ธฐ(Fetch)
Yegr.fetchRequest()๋ก Yegr ์ํฐํฐ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ต๋๋ค.
private func fetchData() -> [Yegr]? {
do {
let data = try self.container.viewContext.fetch(Yegr.fetchRequest())
return data
} catch {
print("error!: \(error.localizedDescription)")
}
return nil
}
(์ ๋ tableView์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ฐํ๊ฐ์ผ๋ก ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฃผ์์ต๋๋ค.)
โฆ ๋ฐ์ดํฐ ์ด๊ธฐํ (Reset)
NSBatchDeleteRequest๋ฅผ ์ฌ์ฉํด์ "Yegr" ์ํฐํฐ์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํฉ๋๋ค.
execute(deleteRequest)๋ก ์ญ์ ์์
์ ์ํํฉ๋๋ค.
private func resetData() {
let fetchRequest: NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Yegr")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try container.viewContext.execute(deleteRequest)
} catch {
print("Error deleting data: \(error)")
}
coreDataView.tableView.reloadData() // ์ ์ฒด ์ญ์ ๋ฒํผ ํด๋ฆญ ํ, ํ
์ด๋ธ๋ทฐ ๋ฆฌ๋ก๋
}
์ด๋ฒ ๊ธ์์๋ CoreData๋ฅผ ์ฌ์ฉํ ๊ฐ๋จํ CRUD์์
์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํด๋ดค์ต๋๋ค.
CoreData๋ ๋ณต์กํ ๋ฐ์ดํฐ ์์
์ ๊ฐ์ํํด์ฃผ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก,
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฐ์ฒด ๋ชจ๋ธ์ ์ฐ๊ฒฐํ์ฌ ๊ฐ์ฒด์งํฅ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ค๋๋ค.
์ด๋ฒ CoreDataEX ํ๋ก์ ํธ๋ฅผ ํตํด ๊ธฐ๋ณธ์ ์ธ ํจํด์ ์ดํดํ ์ ์์๋ ๊ฒ ๊ฐ์ต๋๋ค.๐
์์ผ๋ก๋ ์ฑ์ ๊ฐ๋ฐํ๋ฉด์ ๊ธฐํ๊ฐ ์๊ธด๋ค๋ฉด CoreData๋ฅผ ๊ณ์ ํ์ฉํด๋ด์ผ๊ฒ ๋ค์!
<ํ๋ก์ ํธ github ๋งํฌ>
https://github.com/yeggrrr/CoreDataEX
GitHub - yeggrrr/CoreDataEX: CoreData ์ฐ์ต
CoreData ์ฐ์ต. Contribute to yeggrrr/CoreDataEX development by creating an account on GitHub.
github.com
'Swift > Xcode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] CLLocationManager (0) | 2024.05.31 |
---|---|
[Swift] UIButton Configuration (0) | 2024.05.30 |
[Swift] View Drawing Cycle (0) | 2024.05.28 |
[Swift] Delegate ํจํด (0) | 2024.05.26 |
[Swift] UserDefaults (0) | 2024.05.25 |