Creat : ๋ฐ์ดํฐ ์์ฑ // ์๋ก์ด ์ ํ๋ฒํธ ๋ฑ๋ก
Read : ๋ฐ์ดํฐ ์ฝ๊ธฐ // ์ ์ฅ๋ ์ ํ๋ฒํธ ๋ฐ์ดํฐ ์กฐํ
Update : ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ(์ฐ๊ธฐ) // ์ ์ฅ๋ ์ ํ๋ฒํธ ์์
Delete : ๋ฐ์ดํฐ ์ญ์ // ์ ํ๋ฒํธ ์ญ์
Swift๋ก ๊ธฐ๊ธฐ ๋ด ๋์คํฌ์ ๋ฐ์ดํฐ ์ ์ฅํ๋ ๋ฐฉ๋ฒ์ CoreData์ UserDefault๊ฐ ๋ํ์ ์ด๋ค.
๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋๋ CoreData, ๋น๊ต์ ๋จ์ํ ๋ฐ์ดํฐ๋ UserDefault๊ฐ ์ ์ ํ๋ค.
์ฑ์์ ๊ธฐ๊ธฐ์ ๋์คํฌ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๊ฒ ๋๋ ํ๋ ์์ํฌ
Storage์์ Core Data ์ ํ
Entity ์์ฑ
Attribute๋ก name๊ณผ phoneNumber๋ฅผ ์ถ๊ฐํ๋ค.
์ด๋ ์ ํ๋ฒํธ๋ถ๋ผ๋ ๋ฐ์ดํฐ ์งํฉ์ ์ด๋ฆ๊ณผ ์ ํ๋ฒํธ ์์ฑ์ ๋ถ์ฌํ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ ์ผ์ชฝ ์ด๋ฏธ์ง๋ฅผ ๋ณด๋ฉด, codegen์ด ๊ธฐ๋ณธ์ผ๋ก class defininion์ผ๋ก ๋์ด ์๋ค.
์ด๊ฑธ manual /none์ผ๋ก ๋ฐ๊ฟ์ฃผ์ด์ผ ์๋์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ค๋ฅธ์ชฝ ์ด๋ฏธ์ง์ ์๋จ์ ์๋ํฐ ๋ถ๋ถ์์ ํด๋น ๋ถ๋ถ์ ํด๋ฆญํด์ฃผ๋ฉด ๋๋ค.
Codegen ๊ฐ๋
Code Generator ์ ์ค์๋ง. Entity ๋ฅผ ์ด๋ค ํ์์ ์ฝ๋๋ก ์์ฑํ ๊ฒ์ธ์ง ์ ํํ๋ ์์ฑ.
์์ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค๋ฉด ํด๋น ํ์ผ์ ์ญ์ ํด์ฃผ๊ณ ๋ค์ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
CoreData์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋๋ฐ ํ์ํ ํต์ฌ ๊ฐ์ฒด
CoreData์ ํ๋ก์ ํธ ์ฌ์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋งค๊ฐ์ฒด
๋ฐ์ดํฐ์ ์ ๋ฐ์ดํธ(์ถ๊ฐ, ์ ๋ฐ์ดํธ, ์ญ์ ๋ฑ)๊ฐ ๋ฐ์ํ๋ฉด saveContext()๋ฅผ ํธ์ถํด ๋ฌธ๋งฅ์ ์ ์ฅ
func createData(name: String, phoneNumber: String) {
guard let entity = NSEntityDescription.entity(forEntityName: "PhoneBook", in: self.container.viewContext) else { return }
let newPhoneBook = NSManagedObject(entity: entity, insertInto: self.container.viewContext)
newPhoneBook.setValue(name, forKey: "name")
newPhoneBook.setValue(phoneNumber, forKey: "phoneNumber")
do {
try self.container.viewContext.save()
print("๋ฌธ๋งฅ ์ ์ฅ ์ฑ๊ณต")
} catch {
print("๋ฌธ๋งฅ ์ ์ฅ ์คํจ")
}
}
func readAllData() {
do {
let phoneBooks = try self.container.viewContext.fetch(PhoneBook.fetchRequest())
for phoneBook in phoneBooks as [NSManagedObject] {
if let name = phoneBook.value(forKey: "name") as? String,
let phoneNumber = phoneBook.value(forKey: "phoneNumber") as? String {
print("name: \(name), phoneNumber: \(phoneNumber)")
}
}
} catch {
print("๋ฐ์ดํฐ ์ฝ๊ธฐ ์คํจ")
}
}
func updateData(currentName: String, updateName: String) {
print(#function)
// ์์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํ fetch request ์์ฑ
let fetchRequest = PhoneBook.fetchRequest() //PhoneBook์ ์๋ ๋ฐ์ดํฐ ์กฐํ
fetchRequest.predicate = NSPredicate(format: "name == %@", currentName) // name์ด currentName์ธ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋ ์กฐ๊ฑด๋ฌธ
//์์: ์ด๋ฆ์ด "Jihyeon"์ธ ๋ฐ์ดํฐ ์์
do {
// fetch request ์คํ
let result = try self.container.viewContext.fetch(fetchRequest)
// ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
for data in result as [NSManagedObject] {
// ๋ฐ์ดํฐ ์์ - ๋ฐ์ดํฐ ์ค name์ ๊ฐ์ updateName์ผ๋ก updateํ๋ค.
data.setValue(updateName, forKey: PhoneBook.Key.name) // ์ด๋ฆ์ "Jihyeon"์์ "Swfit"๋ก ์์
// ๋ณ๊ฒฝ ์ฌํญ ์ ์ฅ
try self.container.viewContext.save()
print("๋ฐ์ดํฐ ์์ ์๋ฃ")
}
} catch {
print("๋ฐ์ดํฐ ์์ ์คํจ")
}
}
func deleteData(name: String) {
// ์ญ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ธฐ ์ํ fetch request ์์ฑ
let fetchRequest = PhoneBook.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "name == %@", name)
do {
// fetch request ์คํ
let result = try self.container.viewContext.fetch(fetchRequest)
// ๊ฒฐ๊ณผ ์ฒ๋ฆฌ
for data in result as [NSManagedObject] {
// ์ญ์
// CRUD ์ D.
self.container.viewContext.delete(data)
print("์ญ์ ๋ ๋ฐ์ดํฐ: \(data)")
}
// ๋ณ๊ฒฝ ์ฌํญ ์ ์ฅ
try self.container.viewContext.save()
print("๋ฐ์ดํฐ ์ญ์ ์๋ฃ")
} catch {
print("๋ฐ์ดํฐ ์ญ์ ์คํจ: \(error)")
}
}