Сложность хранения метки времени в хранилище с использованием базовых данных и извлечения согласованных значений - PullRequest
0 голосов
/ 24 апреля 2011

Эй, ребята, я храню метку времени в своем приложении для iPhone через Core Data, в прошлом я успешно делал это, сохраняя двойное значение в виде типа INT 64 в Core Data. Однако недавно мне пришлось изменить его на экземпляр NSNumber вместо простого двойного типа, и с тех пор я не смог получить базовые данные для хранения и получения одного и того же числового значения (ниже приведены попытки с различными типами числовых атрибутов в Основные данные):

enter image description here

enter image description here

enter image description here

Код, который генерирует этот вывод консоли, следующий:

NSLog(@"VALUE BEING STORED: %@",[NSNumber numberWithDouble:tmeStmp]);
[[CoreDataSingleton sharedManager] setItemInDFMWhilePreservingEntityUniquenessForItem:timeStampAttr withValue:[NSNumber numberWithDouble:tmeStmp]];
[[CoreDataSingleton sharedManager] saveStore];
NSLog(@"VALUE RETRIEVED FROM STORE: %@",[[CoreDataSingleton sharedManager] getTimeStamp]);

Соответствующие части setItemInDFMWhilePreservingEntityUniquenessForItem:withValue::

-(void)setItemInDFMWhilePreservingEntityUniquenessForItem:(attribute)attr withValue:(id)value {
//...
        } else if (attr == timeStampAttr) {
            [dfm setTimeStamp:value];
        }
//...
            } else if (attr == timeStampAttr) {
                [[fetchedObjects objectAtIndex:0] setTimeStamp:value];
            }
//...
}

Соответствующие части getTimeStamp:

-(NSNumber *)getTimeStamp {
//...
NSNumber *returnable = [[[NSNumber alloc] initWithDouble:(NSInteger)[[fetchedObjects objectAtIndex:0] valueForKey:@"timeStamp"]] autorelease];
return returnable;
}

Я думаю, что, скорее всего, я не могу адекватно конвертировать числовые типы, но я часами разбирался с кодом без удачи. Есть идеи, где я иду не так? Спасибо!

Ответы [ 3 ]

0 голосов
/ 24 апреля 2011

Все числовые значения, возвращаемые из базовых данных, упаковываются как экземпляры NSNumber.Итак, эта строка:

NSNumber *returnable = [[[NSNumber alloc] initWithDouble:(NSInteger)[[fetchedObjects objectAtIndex:0] valueForKey:@"timeStamp"]] autorelease];

... не будет получать правильное значение, потому что эта часть:

[[fetchedObjects objectAtIndex:0] valueForKey:@"timeStamp"]

... возвращает экземпляр NSNumber, который вы затем приводитеNSInteger.Конечно, это означает приведение адреса памяти объекта к целому числу, которое выдает бессмысленное значение.

За исключением Decimal, числовые типы, которые вы задаете в модели данных, предназначены только для магазина.С точки зрения управляемых объектов все числа являются объектами NSNumber.

Кстати, этот код кажется излишне сложным.Почему вы храните метки времени в виде числовой информации, а не даты?Почему несколько шагов для доступа к маленьким частям данных?Возможно, вы захотите упростить, если это возможно.

0 голосов
/ 29 апреля 2011

Хорошо, так что я только что понял (вернулся через некоторое время). Эта строка (в getTimeStamp):

NSNumber *returnable = [[[NSNumber alloc] initWithDouble:(NSInteger)[[fetchedObjects objectAtIndex:0] valueForKey:@"timeStamp"]] autorelease];

необходимо изменить на это:

NSNumber *returnable = [[fetchedObjects objectAtIndex:0] valueForKey:@"timeStamp"];

Полагаю, я ожидал, что NSNumber будет иметь метод типа initArrayWithArray, но это не так, это вызывает проблемы. Я сохраняю это возвращаемое значение в вызывающей функции, так что все хорошо. Надеюсь, что это поможет другим людям, столкнувшимся с подобной проблемой.

0 голосов
/ 24 апреля 2011

Почему вы начинаете с приведения NSInteger в вашей функции getTimeStamp?Вы можете сохранить метку времени как число, используя NSNumber.

например, я делаю нечто похожее в своем коде, используя timeIntervalSinceReferenceDate, но я думаю, что приложение то же самое:

    action.ID=[NSNumber numberWithDouble:[NSDate timeIntervalSinceReferenceDate]];
    NSLog(@"action ID=%F",[action.ID doubleValue]);

В какой-то момент я подумал, что, возможно, значение нехранится должным образом, но когда я изменил строку формата на% lf, все вышло так, как я хотел.

Помогло ли это или пропустил отметку?

...