티스토리 뷰

Mobile/iOS

[iOS/swift] CoreData 예제

out of coding 2017. 10. 18. 15:18

시작


바로 이전글에 CoreData에 대한 스택을 알아보았다.
이번에는 어떻게 코드로 옮기면 되는지를 알아보도록 한다.
기준 코드는 10으로 되어 있어서. 아래쪽에 추가를 하였으니 그 하위버전은 코드만 보실려면 아래쪽 부터 보시는게 나을수도 있음.


그냥 해보자


- 프로젝트 생성

그냥 프로젝트를 무작정 하나 만들어 보자. 코어데이터 부분을 나중에 코드에 추가해도 되지만 속상하기 싫다면 알아서 추가해주는 옵션을 선택하도록 하자. Use CoreData Check!!

- 엔티티 만들기

관계형 데이터 베이스에서처럼, 테이블의 모델을 정의하는것이다.
1. xcodatamodelId 확장자를 가진 파일을 클릭
2. Add Entity를 눌러줌
3. Add Attribute를 눌러서 속성을 추가하여 준다. 여기서는 name이라고 하나만 추가함

- Managed Object 하위 클래스 생성

앱내에서 데이터 모델은 NSManagedObject 클래스의 하위 클래스에 의해 표현이 되게 된다. 그래서 하위 클래스를 만들어 주어야 한다.

Editor > Create NSManagedObject Subclass...

지금은 아무 생각도 하지 말고 Next... Next... 하자.

- ViewController에서 사용하기

NS가 붙은 녀석들은 가지고 와서 정말 마음에 들지는 않는다. swift4 기준인데도 아직 그럼...

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import UIKit
import CoreData
 
class ViewController: UIViewController {
    
    var managedContext: NSManagedObjectContext? {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return nil
        }
        
        return appDelegate.persistentContainer.viewContext
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        guard save(name: "Test"else {
            return
        }
        
        guard let result = fetch() else {
            return
        }
        
        for element in result {
            guard let name = element.value(forKey: "name"else {
                continue
            }
            
            print("people = \(name)")
        }
    }
    
    func fetch() -> [NSManagedObject]? {
        guard let managedContext = managedContext else {
            return nil
        }
        
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Test")
        
        do {
            return try managedContext.fetch(fetchRequest)
        } catch let error as NSError {
            print("error : \(error)")
        }
        
        return nil
    }
    
    func save(name: String-> Bool {
        guard let managedContext = managedContext else {
            return false
        }
        
        guard let entity = NSEntityDescription.entity(forEntityName: "Test"in: managedContext) else {
            return false
        }
        
        let person = NSManagedObject(entity: entity, insertInto: managedContext)
        person.setValue(name, forKey: "name")
        
        do {
            try managedContext.save()
            return true
        } catch let error as NSError {
            print("error: \(error)")
        }
        
        return false
    }
}
cs

이건 내 소스의 내용이고 그냥 간단하게 뷰컨트롤러가 보여질때 이름을 하나 저장하고 다시 저장된 값을 불러와서 print하는 코드.

다음 시간에는 fetch하여 올때 조건문을 사용하는 방법에 대해서 적겠음.
끝!

추가


제가 위에 올린 코드는 iOS10부터의 기준입니다. 하위 버전은 다음과 같은 부분을 추가하셔서 managedContext를 가져오는 부분을 채우시기 바랍니다. 아래 오류 처리 부분은 적절하게 변경하세요~~

ViewController

1
2
3
4
5
6
7
8
9
10
11
    var managedContext: NSManagedObjectContext? {
        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
            return nil
        }
        
        if #available(iOS 10.0*) {
            return appDelegate.persistentContainer.viewContext
        } else {
            return appDelegate.managedObjectContext
        }
    }
cs

AppDelegate

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
31
32
33
34
35
    // iOS 9 and below
    lazy var managedObjectModel: NSManagedObjectModel? = {
        guard let modelURL = Bundle.main.url(forResource: "CoreDataTest", withExtension: "momd"else {
            return nil
        }
        
        return NSManagedObjectModel(contentsOf: modelURL)
    }()
    
    lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
        guard let managedObjectModel = self.managedObjectModel else {
            return nil
        }
        
        guard let lastUrl = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last else {
            return nil
        }
        
        let coordinator = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
        let url = lastUrl.appendingPathComponent("CoreDataTest.sqlite")
        
        do {
            try coordinator.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: url, options: nil)
        } catch {
            // Exception
        }
        
        return coordinator
    }()
    
    lazy var managedObjectContext: NSManagedObjectContext = {
        var managedObjectContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
        managedObjectContext.persistentStoreCoordinator = self.persistentStoreCoordinator
        return managedObjectContext
    }()
cs



'Mobile > iOS' 카테고리의 다른 글

[iOS] statusbar 높이 구하기  (0) 2017.10.19
[iOS] 버전 분기  (0) 2017.10.18
[iOS] CoreData Stack  (0) 2017.10.18
[iOS] Cocoa Touch Static Library 만들기  (0) 2017.10.16
[iOS/Swift4] KVO 사용하기  (0) 2017.10.10
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/11   »
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
글 보관함