2017-01-20 43 views
1

我必須在Realm存儲大量數據,如14000822124935161134。目前,我通過改變他們的類型,它們存儲到string如下然後將其保存:在Realm中存儲「無符號long long」數字的最佳實踐解決方案

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 

有任何合適的類型而不是string這種類型的數據在Realm或更好的解決方案?

+0

愚蠢的想法,但如果它是一個時間戳,不能你只是存儲的NSDate? –

+0

它有一些不同的結構,不建議轉換爲NSDate。謝謝任何方式 –

回答

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空氣和它似乎是按預期工作:

enter image description here

+0

謝謝,但不幸的是這是不正確的。 'savedTimestamp'與第一個值有不同的值。真實數字是'13951113131432254825',數據庫中保存的數字是'-4495630942277296791',最後顯示的數字是'107202386029632' –

+0

嗯,這很好奇。我自己測試了它,據我所知,它正在按照我的預期工作。我附上了我嘗試過的截圖。是的!這是有道理的,它被表示爲數據庫本身的負數,因爲它被保存爲'簽名長長'。所以儘管二進制數據完全一樣,但它的解釋是不同的。只要你確保你正確地輸入數據,它應該可以正常工作。 – TiM

+0

謝謝TiM。是的,這對我進行的第二次測試沒有任何問題。 –