CoreData NSDate Несоответствие точности SQLite - PullRequest
2 голосов
/ 25 октября 2011

Я видел несколько вопросов, которые всплывают вокруг этой темы, но ничего, что вполне соответствует.

Я создаю метку времени как часть первичного ключа. Отметка времени устанавливается с помощью [Дата NSDate] и сохраняется в хранилище SQLite. Когда я заглядываю в магазин, даты имеют полную точность (до 7 знаков после запятой, указывающих точность до 100 наносекунд).

У меня есть службы, работающие на сервере, на который мне нужно отправить данные и получить дату. Процесс отправки сериализует данные, и для отправки даты с необходимой точностью (сохраненной как datetime2 в SQL Server) я использую:

   NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
   [dateFormat setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'"];
   NSString *stringFromDate = [dateFormat stringFromDate:dateTime];

и наоборот при получении даты с сервера.

Проблема в том, что дата, извлекаемая из хранилища, по какой-то причине ТОЛЬКО с точностью до миллисекунды. Поэтому, если у меня в хранилище есть метка времени как 341196557.808558, извлеките ее в NSDate и затем используйте приведенный выше код для генерации строки, которая читается как «2011-10-24'T'08: 48: 17.8090000».

Это отправляется на сервер, который должным образом сохраняет его с точностью до миллисекунды (потому что это все, что он получает). Когда я затем получаю дату, десериализую ее и пытаюсь использовать предикатную выборку для хранилища, она не возвращает запись, потому что даты не совпадают. Сравнение <или> не сработает, потому что это первичный ключ ... Мне нужно ==

Я бы не отказался от точности до миллисекунды с отметкой времени перед сохранением (если бы я мог разобраться, как), но мне кажется крайне странным, что исходная дата может хранить и сохранять точность в микросекундах, но не сохраняет то же самое точность при получении даты из магазина?

Буду рад любым мыслям об этом, или об этом драгоценном однострочнике, который разберется с этим беспорядком ...

1 Ответ

3 голосов
/ 26 октября 2011

Хотя я не знаю, почему снижается точность наносекунды (это меня удивляет, и вы должны подать на нее радар), я могу сказать следующее:

Метки времени - ужасный первичный ключ. Если вы можете изменить это, я очень рекомендую это.

Если вам необходимо использовать метки времени, я предлагаю вместо этого сохранить базовые данные -timeIntervalSinceReferenceDate, а затем восстанавливать дату всякий раз, когда вам нужно отправить ее на сервер.

Обновление

Метки времени - это боль (как вы испытываете) и расточительные с точки зрения чисто БД, поскольку вы никогда не используете их все по порядку.

В зависимости от того, что вы пытаетесь сделать, увеличенный INT64 (непросто с Core Data) работает хорошо. Если вы используете временную метку не только для части уникального ключа, то я бы просто сохранил ее как NSTimeInterval (double), как я предложил выше. Это сохранит вашу точность и позволит избежать путаницы со строками. Имейте в виду, что строки могут быть довольно медленными.

...