-
Notifications
You must be signed in to change notification settings - Fork 6
CoreData
lou0124 edited this page Nov 12, 2021
·
1 revision
처음에 이러한 형식처럼 구조체 안에 구조체 배열을 가지고 있는 형식의 데이터타입을 CoreData에 저장을 하고 싶었습니다.
-
location의 데이터 타입을 Transformable로 설정을 하고 Custom class를 [Location] 으로 설정을 해주었습니다.
-
그 다음에는 CoreData struct 타입이 아닌 class 타입이 저장된다는 것을 알고 데이터타입을 클래스 타입으로 바꾸고 아카이빙 과정이 필요하다고 생각하여 NSCoding을 상속받아 인코딩 디코딩 처리를 해주고 저장을 시도하였습니다.
하지만 실패..
가장 생각해 내기 쉬운 방법인데 위에서 시도한 방법을 하기 전까지는 이상하게 생각이 안 났었습니다. 바로 Relationship을 통해 Entity를 관계 설정을 하는 방법입니다.
현재 이러한 형식으로 Entity구조를 만들었습니다. (Records Entity가 추가 됨)
- Attributes를 설정해주고 Entity 이름과 Class이름을 설정해줍니다.
- Entity는 NSManagedObject를 상속받는 Class타입으로 다룰 수 있다.
-
Relationship을 추가한다.
- Inverse 속성에 표시를 하면 상대방이 나를 참조하고 있는 형태가 된다.
-
설정에서 Type을 To Many로 하면 한개 이상의 레코드를 가질 수 있다.
-
Arrangement Ordered를 체크하면 참조가 등록된 순서대로 정렬이 된다.
*Entity를 표현하는 NSManagedObject 클래스 확인 방법
- 해당 메뉴를 클릭하면 파일이 생성됩니다.
- 파일이 생성된 모습
- 파일에 들어가시면 클래스를 확인할 수 있습니다.
- 처음에 클래스를 들어가시면 오류가 뜹니다.
- Manual/None을 하지 않은 상태에서는 이미 클래스가 만들어진 상태에서 다시 클래스를 만든 형태가 되기 때문에 오류가 발생
- Manual/None을 하면 오류가 없어지고 해당 클래스를 Custom하게 만들 수 있음 (메소드 추가 등)
// 엔티티 이름을 통해 NSManagedObject타입의 인스턴스를 만든다. (RecordsEntityMO로 사용가능)
let recordsObject = NSEntityDescription.insertNewObject(forEntityName: "RecordsEntity",
into: context)
// Attributes의 이름을 통해 데이터를 저장한다.
recordsObject.setValue(records.title, forKey: "title")
// 구조체 배열형태의 데이터는 For문을 통해 일일히 NSManagedObject타입의 데이터를 만들어 값을 설정해 주고 상위의 객체에 추가해준다.
records.records.forEach {
let recordObject = NSEntityDescription.insertNewObject(forEntityName: "RecordEntity",
into: context) as? RecordEntityMO
recordObject?.startTime = $0.startTime
recordObject?.endTime = $0.endTime
recordObject?.distance = $0.distance
recordObject?.step = Int16($0.step)
// addToRecords 메소드(데이터 추가)는 RecordsEntity를 만들 때 관계 설정을 해주면 자동으로 만들어 진다.
guard let recordObject = recordObject else { return }
(recordsObject as? RecordsEntityMO)?.addToRecords(recordObject)
$0.locations.forEach {
let locationObject = NSEntityDescription.insertNewObject(forEntityName: "LocationEntity",
into: context) as? LocationEntityMO
locationObject?.altitude = $0.altitude
locationObject?.latitude = $0.latitude
locationObject?.longitude = $0.longitude
guard let locationObject = locationObject else { return }
recordObject.addToLocations(locationObject)
}
}
do {
// 이 부분을 해야 CoreData에 저장이 이루어 진다.
try context.save()
} catch {
}
do {
let request = NSFetchRequest<RecordsEntityMO>(entityName: "RecordsEntity")
let result = try context.fetch(request)
} catch {
}
- result에 [RecordsEntityMO]가 저장이 됩니다.
- RecordsEntityMO 인스턴스의 Attributes(프로퍼티로 접근하여)를 사용할 수 있습니다.
- RecordsEntityMO는 NSOrderedSet?을 프로퍼티로 가지고 있으며 Set에 있는 값을 RecordEntityMO로 타입캐스팅하여 사용할 수 있습니다.
트러블 슈팅
회의록
- 2021-10-25(월)
- 2021-10-26(화)
- 2021-10-27(수)
- 2021-10-28(목)
- 2021-11-01(월)
- 2021-11-02(화)
- 2021-11-03(수)
- 2021-11-04(목)
- 2021-11-08(월)
- 2021-11-09(화)
- 2021-11-10(수)
- 2021-11-11(목)
- 2021-11-15(월)
- 2021-11-16(화)
- 2021-11-17(수)
- 2021-11-18(목)
- 2021-11-22(월)
- 2021-11-23(화)
- 2021-11-24(수)
- 2021-11-25(목)
- 2021-11-29(월)
- 2021-11-30(화)
- 2021-12-01(수)
- 2021-12-02(목)
스크럼
- 2021-10-26(화)
- 2021-10-27(수)
- 2021-10-28(목)
- 2021-10-29(금)
- 2021-11-01(월)
- 2021-11-02(화)
- 2021-11-03(수)
- 2021-11-04(목)
- 2021-11-08(월)
- 2021-11-09(화)
- 2021-11-10(수)
- 2021-11-11(목)
- 2021-11-15(월)
- 2021-11-16(화)
- 2021-11-17(수)
- 2021-11-18(목)
- 2021-11-22(월)
- 2021-11-23(화)
- 2021-11-24(수)
- 2021-11-25(목)
- 2021-11-29(월)
- 2021-11-30(화)
- 2021-12-01(수)