Как правильно запросить объект по свойству NSDate в Realm? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть следующий сценарий, я сохраняю объект в области с текущей датой, например:

RLMChatMessage *chat = [[RLMChatMessage alloc] init];
chat.chatFrom = from;
chat.chatTo = to;
chat.timeStamp = [NSDate date];

RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock: ^{
      [realm addObject: chat];
}];

Чтобы отправить метку времени на сервер, я преобразую ее в NSString следующим образом:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:  @"YYYYMMddHHmmssSSS”]; // Capital ’S’ is milliseconds
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
return [dateFormat stringFromDate: date];

Результат метки времени в NSString: 20190612090741181 с форматом «ГГГГМДДЧЧммсссс».

Когда я получаю подтверждающее сообщение для конкретной метки времени, я преобразую NSString обратно в NSDate:

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat: @"YYYYMMddHHmmssSSS”];
[dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
return [dateFormat dateFromString: strTime];

Я запрашиваю чат с отметкой времени (объект NSDate, созданный с помощью вышеуказанного кода) следующим образом:

RLMResults *results = [RLMChatMessage objectsWhere:@"timeStamp == %@", date];
return results.firstObject;

К сожалению, в результатах не найдено ни одного объекта. Каким-то образом Realm может 'Кажется, я не могу найти объект чата с предоставленной временной отметкой NSDate. Используя приложение Realm Browser для просмотра в базе данных, я вижу свойство NSDate со следующей NSDate: enter image description here

NSLogвывод в Xcode для преобразования метки времени NSString в NSDate выглядит следующим образом: enter image description here

Так что оба показывают метку времени NSDate одинаково. Я предполагаю, что оба print объект NSDate по местному времени моей машины.Так почему же Realm не может найти объект чата?Я как бы потерялся здесь.Надеюсь, кто-нибудь может мне помочь.

1 Ответ

0 голосов
/ 13 июня 2019

Я нашел решение, похоже, что преобразование времени NSString с форматом «YYYYMMddHHmmssSSS» в NSDate теряет некоторую информацию или точность. Как следствие, исходный объект NSDate, хранящийся в базе данных, не совпадает с объектом, преобразованным из NSString. Поэтому вместо назначения timeStamp с текущим временем, например: [NSDate date], я воссоздаю новый объект NSDate с форматом «YYYYMMddHHmmssSSS», например:

- (NSDate*) timeStampNowWithFormat: (NSString*) format {
    NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
    [dateFormat setDateFormat: format];
    [dateFormat setTimeZone:[NSTimeZone timeZoneWithName:@"UTC"]];
    NSString *stringDate = [dateFormat stringFromDate: [NSDate date]];

    return [dateFormat dateFromString: stringDate];
}

// ...
// ...

RLMChatMessage *chat = [[RLMChatMessage alloc] init];
chat.chatFrom = from;
chat.chatTo = to;
chat.timeStamp = [self timeStampNowWithFormat: @"YYYYMMddHHmmssSSS"];

RLMRealm *realm = [RLMRealm defaultRealm];
[realm transactionWithBlock: ^{
      [realm addObject: chat];
}];

Подводя итог, как только вы преобразуете объект NSDate в NSString, а затем воссоздаете новый NSDate из этого NSString, оба объекта NSDate больше не равны, если точность времени меньше миллисекунд (то есть микросекунд). Мне потребовалось больше дня, чтобы понять это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...