문제

iPhone에 핵심 데이터를 사용하여 일일 데이터를 저장하는 현명한 방법을 찾으려고 노력했습니다.

내 앱은 날짜가 있지만 시간이없는 CSV 형식의 데이터를 수신합니다.

date, cycles
2009-08-01, 123
2009-08-02, 234
2009-08-03, 345
2009-08-04, 456

이 데이터가 저장되면 하루에 하나의 레코드 만 있어야합니다. 가장 좋은 방법은 저장할 nsdate를 만드는 것이지만 시간 및 시간대 데이터를 제거하는 것이 었습니다.

nsdatecomponents 또는 nsdateformatter를 사용하여 몇 시간, 몇 분 또는 초없이 NSDate를 쉽게 만들 수 있습니다. 그러나 시간대를 UTC로 명시 적으로 또는 GMT에서 0 초로 설정하더라도 nslog ()로 생성 된 날짜를 출력합니다. 언제나 내 현지 시간대는 다음과 같습니다.

2009-07-29 00:00:00 +0100

시간 구성 요소없이 NSDATE를 만드는 더 좋은 방법을 아는 사람이 있습니까? 아니면 날짜를 저장하는 더 나은 방법일까요?

도움이 되었습니까?

해결책

좋은 프로그래밍 규칙은 항상 UTC에 날짜를 저장하는 것입니다. 핵심 데이터를 사용하든 아니든 상관 없습니다. 애플의 데이트 수업이 거의 빨라서 여전히 일을해야 할 것입니다.

날짜는 참조 날짜 이후 몇 초로 내부적으로 표현됩니다. 즉, 2001 년 1 월 1 일 00:00:00 (실제 참조 날짜는 그다지 중요하지 않지만). 포인트는 NSDate 물체는 항상 UTC에 기본적으로 있습니다. CSV 파일에 들어가는 날짜가 로컬 인 경우 UTC 시간을 얻으려면 이와 같은 작업을 수행해야합니다.

NSDate *UTCDate = [localDate addTimeInterval:-[[NSTimeZone localTimeZone] secondsFromGMT]];

그런 다음 시간을 00:00:00으로 설정했습니다. 이제 자정에 UTC에서 날짜를 저장하고 있습니다. 프리젠 테이션 목적으로, 귀하는 An을 사용합니다 NSDateFormatter 선택한 시간대 (시스템 시간대는 기본값은 기본값입니다)로 해당 날짜를 표시합니다.

하지만 시간대는 날짜를 다루는시기에 중요하지 않습니다. 시간대를 설정하는 한 NSDateFormatter UTC에는 사용자가 장치에서 선택한 시간대에 관계없이 항상 같은 날짜를 표시합니다.

이 솔루션이 마음에 들지 않으면 언제든지 날짜를 대체 형식으로 저장할 수 있습니다. 당신은 a를 사용할 수 있습니다 double 또는 int 날짜를 일부 사용자 정의 형식으로 저장하려면 (예 : 일부 참조 날짜 이후의 일수), 또는 자신의 클래스를 롤링하여 원하는 방식으로 날짜를 모델링하고 저장할 수도 있습니다. NSData 물체. 수업이 구현되는 한 NSCoding, 당신은 그것을 an에 직렬화 할 수 있습니다 NSData 핵심 데이터의 개체. 코어 데이터의 속성 유형을 "변환 가능"로 설정하면됩니다.

여기에는 많은 옵션이 있으며, 그중 어느 누구도 자신의 SQLite 쿼리 및 데이터베이스를 작성하려는 노력과 관련이 없습니다.

다른 팁

NSDate에는 시간대가 없습니다. NSLOG는 현지 시간대를 사용합니다. 그것은 당신이있는 곳이기 때문에 +0100이라고 말합니다.

NSDate 객체는 항상 시간 날짜를 통합합니다. 문서를 인용하려면 "단일 지점을 나타냅니다"를 인용하고 참조 날짜 이후 시간 값을 저장하여 (GMT에서 2001 년 1 월 1 일 시작, 다시 한 번. 문서). 그러므로 당신은 시간을 알지 못하는 nsdate를 가질 수 없습니다.

자신의 방식으로 데이트를 시도하고 저장하는 대신 여전히 모델에서 NSDATE를 사용하고 엔티티 클래스에 한 쌍의 메소드를 추가하는 것을 고려할 것입니다. 그 중 하나는 위에서 설명한 작업을 수행하여 NSDATE를 00:00:00으로 설정합니다. 주어진 날. 다른 하나는 NSDate에서 날짜를 선호하는 형식으로 반환 할 수 있습니다. 그런 다음 핵심 데이터 생성 getter 및 setter를 사용하여 NSDate 속성에 액세스합니다.

여전히 NSDate를 사용하면 Core Data가 기본적으로 작동 할 수있는 클래스를 사용하고 있습니다. 즉, 필터링을 위해 쉽게 Predicates를 사용할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top