【问题标题】:Best practice solution for storing "unsigned long long" number in Realm在 Realm 中存储“unsigned long long”数字的最佳实践解决方案
【发布时间】:2026-01-27 23:00:01
【问题描述】:

我必须将大量数字存储在 Realm 存储中,例如 14000822124935161134。目前我通过将它们的类型更改为string来存储它们,如下所示,然后保存:

    NSMutableDictionary *itemInsert = [item mutableCopy];

    if([item valueForKey:@"timestamp"]) {
        unsigned long long timestamp = [[item valueForKey:@"timestamp"] unsignedLongLongValue];
        [itemInsert setObject:[NSString stringWithFormat:@"%llu", timestamp] forKey:@"timestamp"];
    }

    RLMRealm *realm = [RLMRealm defaultRealm];
    [realm beginWriteTransaction];
    [RMember createOrUpdateInRealm:realm withValue:itemInsert];
    [realm commitWriteTransaction];

而我的RLMObjecttimestamp 属性定义如下:

@interface RMember : RLMObject
...
@property (nullable) NSString *timestamp;
...
@end

对于Realm中的这种类型的数据,是否有任何适合的类型而不是string或任何更好的解决方案?

【问题讨论】:

  • 愚蠢的想法,但如果它是一个时间戳,你不能只存储一个 NSDate 吗?
  • 它的结构有点不同,不建议转换为 NSDate。感谢任何方式

标签: ios objective-c realm long-integer


【解决方案1】:

Realm 支持long long;它只是不支持unsigned 变体。

您可以简单地将值保存为 long long,并提供一个 getter 访问器,当从数据库中检索时,该访问器将其显式转换回 unsigned long long

@interface RMember : RLMObject
@property long long timestamp;
@end

unsigned long long timestamp = [[item valueForKey:@"timestamp"] unsignedLongLongValue];

RLMRealm *realm = [RLMRealm defaultRealm];
RMember *myObject = ...;
[realm transactionWithBlock:^{
    myObject.timestamp = (long long)timestamp;
}];

unsigned long long savedTimestamp = (unsigned long long)myObject.timestamp;
NSLog(@"Saved timestamp is %llu", savedTimestamp);

在我的 iPad Air 上测试,它似乎按预期工作:

【讨论】:

  • 谢谢,但不幸的是它不正确。 savedTimestamp 与第一个具有不同的价值。真实号码为13951113131432254825,数据库中保存号码为-4495630942277296791,最终显示号码为107202386029632
  • 嗯,这很好奇。我自己测试了它,据我所知,它按我的预期工作。我附上了我尝试过的截图。是的!它在数据库本身中表示为负数是有道理的,因为它保存为signed long long。因此,虽然二进制数据完全相同,但它的解释不同。只要您确保正确地对数据进行类型转换,它就应该可以正常工作。
  • 谢谢蒂姆。是的,这对于我进行的第二次测试没有任何问题。