Как определить тип свойства NSNumber в Core Data - PullRequest
7 голосов
/ 21 апреля 2011

У меня есть проект iOS 4 с использованием Core Data.Когда я проектирую базовую модель данных, атрибуты имеют Integer 64, Integer 32, Integer 16, Decimal, Double, Float и Boolean.

Но в сгенерированных подклассах NSManagedObject все они NSNumber*.Поэтому, когда я использую его, как я могу определить, является ли NSNumber long, double, float или BOOL?

Ответы [ 4 ]

8 голосов
/ 21 апреля 2011
NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:myManagedObjectContext];
NSAttributeDescription *attribute = [[entity attributesByName] objectForKey:@"myAttribute"];
if ([attribute attributeType] == NSInteger32AttributeType) {
    // We have an Integer32
    // ...
}

Проверьте заголовок NSAttributeDescription.h на наличие других допустимых типов атрибутов, кроме NSInteger32AttributeType.

2 голосов
/ 21 апреля 2011

NSNumber является бесплатным по мосту с CFNumber, и CFNumber может сделать это:

NSNumber *someNum = [myManagedObject someNum];
CFNumberType t = CFNumberGetType((CFNumberRef)someNum);

Значение перечисления CFNumberType указывает тип, который фактически используется классом чисел для хранения вашего значения. Но тип не обязательно будет тем, что, как вы сказали, должен быть при создании числа, поэтому, если вы хотите знать, какой тип ожидает модель, вам следует поступить так, как предложил Оле Бегеманн, и получить тип атрибута AttributeDescription.

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

Слой Core Data может работать только с объектами, различные варианты, которые вы видите, это то, как он будет храниться в базовой базе данных.Класс NSNumber может свободно «конвертировать» между вышеуказанными значениями.Просто выберите, что имеет смысл делать в вашем случае.Это бул?затем сохраните его как таковой (занимает меньше места в БД), нужна ли вам высокая точность, выполните удвоение и т. д. Когда вы во время выполнения работаете со значениями, NSNumber позаботится обо всем за вас.Таким образом, доступ к коду в коде выглядит следующим образом:

if([[NSManagedObject isActive] boolValue])

или установка:

[[NSManagedObject setIsActive:[NSNumber numberWithBool:YES]];
0 голосов
/ 21 апреля 2011

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

...