我有以下情况,我将具有当前日期的对象存储在Realm上,如下所示:
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,格式为“ YYYYMMddHHmmssSSS”。
当我收到特定时间戳记的确认消息时,我将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属性:
用于将NSString时间戳转换为NSDate的Xcode中的NSLog输出如下所示:
因此,两者都显示相同的NSDate时间戳。我假设两个都将NSDate对象打印到我的机器的本地时间。那么,Realm为什么找不到聊天对象?我有点迷失在这里。希望有人能帮助我。
答案 0 :(得分:0)
我找到了解决方案,似乎将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,然后从该NSString重新创建新的NSDate,则如果时间精度小于毫秒(即微秒),则两个NSDate对象将不再相等。 我花了一天多的时间才能解决这个问题。