์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Firestore CRUD
- Figma
- Filter
- Cloud Firestore
- Core Data
- ์ง๋ฒ๋ณํ
- ํ๋ก๊ทธ๋๋จธ์ค
- components
- Codable
- Mac
- ์ฑ๋ง๋ค๊ธฐ
- ์ฑ๋์์ธ
- UIRefreshController
- Encodable
- mongoose
- Reduce
- nodejs
- String.Index
- ios
- CRUD
- MongoDB
- DispatchQueue
- ์๊ณ ๋ฆฌ์ฆ
- SWiFT
- AVAudioPlayer
- ExpressJS
- Decodable
- RxSwift
- Firestore
- map
- Today
- Total
Focus On Develop ๐ค๐ค
[Swift] Core Data(2) ์ค์ตํด๋ณด๊ธฐ ๋ณธ๋ฌธ
[Swift] Core Data(2) ์ค์ตํด๋ณด๊ธฐ
๋๋ฆฌ๋ฌ์ดํ 2020. 12. 21. 16:33Core Data ๊ฐ๋ ๋จผ์ ์์๋ณด๊ณ ์ค๊ธฐ!! ๐ 2020/12/21 - [iOS [Swift]/๊ธฐ์ด๋ฅผ ํํํ!] - [Swift] Core Data(1) ๊ฐ๋ ์ ๋ฆฌ
STEP 1. Core Data, Core Data Model ๋ง๋ค๊ธฐ
์ ๊ท ํ๋ก์ ํธ๋ผ๋ฉด ์์ฑ์ Use Core Data๋ฅผ ์ ํํด์ค์๋ค. ๋ง์ฝ ๊ธฐ์กด ํ๋ก์ ํธ์ Core Data๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด, Core Data ํ์์ Data Model ํ์ผ์ ์ ํํด์ ์์ฑํด์ฃผ๋ฉด ๋์.
๊ทธ๋ผ ์ข์ธก์ ํ์ผ ๋ชฉ๋ก์ ๋ณด๋ฉด ์ด๋ ๊ฒ .xcdatamodeld ํ์ผ์ด ์์ฑ๋์์ ๊ฑฐ์์.
์ด์ ์ฌ๊ธฐ์ ๋ชจ๋ธ์ ์์ฑํด์ฃผ๋ฉด ๋์ ใ ใ ์ข์ธก ํ๋จ์ Add Entity๋ฅผ ํตํด Entity๋ฅผ ์์ฑํ๊ณ (Database์์ ํ ์ด๋ธ ์ด๋ผ๊ณ ๋น์ ํด์ ์๊ฐํ๋ฉด ์ข์ ๊ฒ ๊ฐ์) Add Attribute๋๋ '+' ๋ฒํผ์ ํตํด Attribute๋ฅผ ๋ง๋ค์ด ์ฃผ๋ฉด ๋์. (Database์์ ์ปฌ๋ผ์ผ๋ก ๋น์ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์)
ํ์ ์ ์ง์ ํ ๋ Custom Type์ผ๋ก ์ ์ํ๊ณ ์ถ๋ค๋ฉด, Type์ Transformable๋ก ์ง์ ํ๊ณ Attribute Inspector์์ Custom Class๋ฅผ ์ค์ ํด์ฃผ๋ฉด ๋์. ex) [String], [String: Any] ๋ฑ
๊ทธ๋ฆฌ๊ณ Entity ์ค์ ์ ์ฐ์ธก Inspector๋ฅผ ๋ณด๋ฉด Codegen์ด๋ผ๋ ์์ญ์ด ์๋๋ฐ, ์ด ๋ถ๋ถ์ ์ฅ/๋จ์ ์ด ๊ฐ๊ฐ์์ผ๋ ์ ๋ง์ ๋ง๋ ๊ฒ์ ์ ํํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค ใ ใ ( ๋๋ ๊ฐ์ธ์ ์ผ๋ก Manual/None์ด ์ข์ ๊ฒ ๊ฐ๋ค.. ๐ )
- Manual/None
- Access Modifiers๋ฅผ ๋ณ๊ฒฝํ๊ณ , method๋ ๋ก์ง์ ์ถ๊ฐํ๊ธฐ ์ํด managed object subclass๋ฅผ Customizingํ๊ณ ์ถ์ ๊ฒฝ์ฐ
- model์ ๋ณ๊ฒฝ๋์ ์๋ก Generating ํ ๋๋ง๋ค ๊ธฐ์กด model์ ๊ฐฑ์ ํด์ค์ผํจ
- Class Definition
- Core Data๊ฐ ์์ฑํ managed object subclass ๋ฐ property, ๊ธฐ๋ฅ์ Customizing ํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ
- ์ฆ XCode์์ ์์์ ์ฒ์ฒ ํด์ค๋ค๋ ์๋ฏธ์ด๊ณ , ์์ค์ฝ๋๊ฐ ์์ค ๋ชฉ๋ก์ ๋ํ๋์ง ์๋๋ค
- SubClass๋ฅผ ์ญ์ ํ๋๋ผ๋ ๋์๋ ์๋ณด์ด์ง๋ง ๋จ์์์.. (๋์ค์ ํ์ผ์ด ๊ผฌ์ผ ์ ์์)
- model์ด ๋ณ๊ฒฝ๋๋ Generating์ ์์์ ์ฒ์ฒ ํด์ค
- Category/Extension :
- managed object subclass์ method๋ ๋ก์ง์ ์ถ๊ฐํ๊ณ ์ถ์๋
- ํด๋์ค ํ์ผ์ ์์ ํ ์ ์ดํ ์ ์์ผ๋ ๋ชจ๋ ์๋์ผ๋ก ๋ง๋ค๊ณ ๊ด๋ฆฌํด์ค์ผ ํจ
์ด์ ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ ์๋ฃํ์ผ๋ฉด, Model์ Generating ํ๋ฉด ๋์. Editor > Create NSManagedObject Subclass
(Relationship์ ์ง๊ธ์ ๊ฐ๋จํ ์์ ๋ก ํด๋ณด๋ ๊ฑฐ๋ผ์ ๋์ค์ ๊ณต๋ถํด๋ณผ๊ฑฐ๋ค.. ๐)
์ง์~ ์ด๋ ๊ฒ ํ๊ณ ๋๋ฉด ๋ด๊ฐ ๋ฐฉ๊ธ ๋ง๋ค์๋ Entity์ ๋ํด Model File์ด ์ถ๊ฐ๋๋ต๋๋ค~~
์ฌ๊ธฐ์ ๋์ฌ๊ฒจ ๋ณด๋ฉด ์ข์๊ฑด, Property ํ์ผ์ ์๋์ฒ๋ผ fetchRequest๊ฐ ์๊ธฐ๋๋ฐ, ์ด method๋ฅผ ํตํด์ Data๋ฅผ ๋ถ๋ฌ์ฌ ๊ฒ์ด๋ ๊ธฐ์ตํด๋์ฃ !
extension Todo {
@nonobjc public class func fetchRequest() -> NSFetchRequest<Todo> {
return NSFetchRequest<Todo>(entityName: "Todo")
}
@NSManaged public var contents: String?
@NSManaged public var date: Date?
@NSManaged public var id: Int64
@NSManaged public var priority: Int64
}
STEP 2. ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ ๋ถ๋ฌ์ค๊ธฐ
์ฑ์ Core Data๋ฅผ ์ ์ฉํ๊ณ ๊ฐ๋จํ Model์ ์์ฑํด๋ดค์ด์. ๋ฒ์จ ์ ๋ฐ์ ํ๊ตฐ์..!? ์์์ด ๋ฐ์ด๋ค ใ ใ ๐ค๐ค
CoreData๋ฅผ ์ ์ฉํ๋ฉด AppDelegate์ persistentContainer, saveContext()๊ฐ ์๊ธฐ๋๋ฐ์~! ์๊ธฐ์ ์์ฑ๋ persistentContainer๊ฐ ๊ฐ๋ ์ ๋ฆฌ์์ ์ดํด๋ณด์๋ ๊ฒ์ฒ๋ผ ์ฐ๋ฆฌ๊ฐ ์ ์ฅํ๋ Data๊ฐ ๋ด๊ธฐ๋ ์ ์ฅ์๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ๊ณ , saveContext๋ ๋ง๊ทธ๋๋ก ๊ธฐ์กด ๋ฐ์ดํฐ์ ๋น๊ตํ์๋ ๋ณํ๊ฐ ์์ผ๋ฉด ์ค์ ๋ก ์ ์ฅํ๋ method๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ์์.
์ด์ ViewController๋ก ๊ฐ์, persistentContainer๋ก ์ ๊ทผํ๊ธฐ ์ํ NSManagedObjectContext๋ฅผ ์์ฑํด์ค์๋ค!
// Reference to managed object context
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
์ด์ persistentContainer๋ก ์ ๊ทผํด์ CRUD๋ฅผ ์ํด, ์ฌ๊ธฐ์ ์ ์ํ context๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์๋ค์~!! ์ผํธ ๐
์์์ ์ค๋ช ํ๋ ๊ฒ์ฒ๋ผ, ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด์ ๋ชจ๋ธ Generating์ ์์ฑ๋ fetchRequest๋ฅผ ํธ์ถํด์ค์๋ค~! ํธ์ถ๋ ๊ฒฐ๊ณผ๋ฅผ context.fetch()๋ฅผ ํตํด ์ค์ ๋ด๊ฐ ์ฌ์ฉํ ๋ฐ์ดํฐ์ ๋ด์์ฃผ๊ณ ์~!!
(์ ์ฅ๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ items์ ๋ด๊ณ , tableView ๊ฐฑ์ ํด์ฃผ๊ธฐ! ์ ๋ ๊ณต๋ถ๋ฅผ ์ํด ๋ง์ธ์ tableView๋ฅผ ์ฌ์ฉํ์ต๋๋ ใ ใ )
func fetchTodo() {
do {
let request = Todo.fetchRequest() as NSFetchRequest<Todo>
self.items = try context.fetch(request)
DispatchQueue.main.async {
self.tableView.reloadData()
}
} catch let error {
print("---> \(error.localizedDescription)")
}
}
๋ถ๋ฌ์ค๋ ๊ฒ์ ํ์ธํ์ผ๋, ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๊ฑด ์ด๋ป๊ฒ ํ ๊น~~? ์๋์ ์ฝ๋๋ฅผ ๋ณด์. ์..?? ๋ด๊ฐ ์๋ ๋ฐ๋ก ๋ชจ๋ธ ์ ์ํด์ ์์ฑํด์ฃผ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋์ผํ๋ค..!?!? ๋ง์ต๋๋ค!! ๋์ , initialize์ ์์์ ์ ์ํ ํ์ฌ context๋ฅผ ๋ฃ์ด์ค์๋ค! ๊ทธ๋ฆฌ๊ณ ๊ฐ Attribute๋ ์น์ ํ๊ฒ ์ฑ์์ฃผ๋๋ก ํฉ์๋ค~!! ํธํซ ๐๐ ์ ์ฅ์ context.save() method๋ฅผ ํธ์ถํ๋ฉด ๋๋ต๋๋ค~~ ์ ์ฅ ํ์๋ ์๋ก ํ๋ฒ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ผ๊ฒ ์ฃ ~~?
// create a todo object
let newTodo = Todo(context: self.context)
newTodo.contents = textfield.text
newTodo.date = Date()
newTodo.id = 1
newTodo.priority = 1
// save the data
do {
try self.context.save()
} catch let error {
print("save error ---> \(error.localizedDescription)")
}
// refetch the data
self.fetchTodo()
STEP 3. ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ๋ฐ ์ญ์
๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๊ธฐ ์ํด์๋, ๋จผ์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธํ ์ง ์ ํํด์ผ๊ฒ ์ฃ ~~? (์ ๋ tableView๋ก ์ค์ตํด์ items[indexPath.row]๋ก ์ ํํ๋ต๋๋ค~ ์ ํ๋ todo.contents๋ฅผ ์๋ ์ฝ๋์ฒ๋ผ ๋ณ๊ฒฝํด์ฃผ๋ฉด ๋์! ์ ๋ฐ์ดํธ ํ ์ ์ฅ, ๋ฐ์ดํฐ๋ฅผ ์๋ก ๋ถ๋ฌ์์ ํ์ํด์ฃผ๋ ๊ฑด ๊ฐฑ์ ๋ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ธฐ ์ํ ํ์~!! ๐
let todo = self.items[indexPath.row]
...
// edit contents property of todo object
todo.contents = textField.text
// save the data
do {
try self.context.save()
} catch let error {
print("save error ---> \(error.localizedDescription)")
}
// refresh the data
self.fetchTodo()
์ค์ตํ ๊ฒ ์ค์ ์ ~~์ผ ์ฌ์ด๊ฒ ๋ฐ์ดํฐ ์ญ์ ์์. ์ ๋ฐ์ดํธ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ญ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ํํ ๋ค์, context.delete() method๋ฅผ ํธ์ถํด์ฃผ๋ฉด ๋๋ต๋๋ค~ ์ญ์ ์ญ์ ํ์๋ ๋ฐ์ดํฐ ์ ์ฅ๊ณผ ๊ฐฑ์ ์ ํ์! ๐
let todoToRemove = self.items[indexPath.row]
...
// remove the todo
self.context.delete(todoToRemove)
// save the data
do {
try self.context.save()
} catch let error {
print("save error ---> \(error.localizedDescription)")
}
// refresh the data
self.fetchTodo()
์ด๋ ๊ฒ ์ฐ๋ฆฌ ๊ฐ์ด Core Data ์ ์ฉ ๋ฐ ๋ชจ๋ธ์์ฑ, NSManagedObjectContext๋ฅผ ํตํ PersistentContainer๋ก ์ ๊ทผ ๋ฐ ๊ธฐ๋ณธ์ ์ธ CRUD๋ฅผ ์ค์ตํด๋ดค๋๋ฐ์~!! ์ด๊น์ง ๊ธด ์ฌ์ ๋ฐ๋ผ์ค์ ๋ชจ๋ ๋ถ๋ค ์๊ณ ํ์ จ์ต๋๋ค ๐ค๐ค (์์๊ณผ ๋ค๋ฅด๊ฒ NS ์ด์ฉ๊ตฌ ์ ์ฉ๊ตฌ๊ฐ ๊ทธ๋ ๊ฒ ๋ถํธํ์ง ์๊ณ ์์ฃผ ์ฝ~๊ฐ์ ์ต์ํด์ง์ จ๊ธธ ๋ฐ๋๋๋ค ใ ใ ๐)
Core Data ๊ฐ๋ ์์๋ณด๋ฌ ๊ฐ๊ธฐ!! ๐ 2020/12/21 - [iOS [Swift]/๊ธฐ์ด๋ฅผ ํํํ!] - [Swift] Core Data(1) ๊ฐ๋ ์ ๋ฆฌ
์ถ์ฒ ๋ฐ ์ฐธ๊ณ
1) www.youtube.com/user/CodeWithChris
์ง์ง Chris๋ ๋๋ฌด ์ข์ ๊ฐ์ ๊ฐ์ฌํฉ๋๋ค ๐ CWC+๊ฐ์๋ ๋๋ฌด ๋ฃ๊ณ ์ถ์ง๋ง ์์ฝ๊ฒ๋ ๋น์ผ๊ฑฐ๊ฐ์์..๐ญ
Thank you for good lecture Chris ๐ I want to take a CWC+ lectures, but it's expensive for me.. sorry.. ๐ญ
But i subscribed your channel ๐
'iOS [Swift] > ๊ธฐ์ด๋ฅผ ํํํ!' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ARC (Automatic Reference Counting) (0) | 2021.01.29 |
---|---|
[Swift] ์๊ณ ๋ฆฌ์ฆ ์ฝ๋ฉ์ ์ ์ฉํ Tip๋ค! (0) | 2021.01.05 |
[Swift] Core Data(1) ๊ฐ๋ ์ ๋ฆฌ (0) | 2020.12.21 |
[Swift] String.components (0) | 2020.12.18 |
[Swift] String.Index (0) | 2020.12.17 |