【问题标题】:Can't get correct int value from fetching core data in iOS无法通过在 iOS 中获取核心数据获得正确的 int 值
【发布时间】:2015-01-21 09:23:35
【问题描述】:

我在从core data中取数据的时候发现一个奇怪的问题,我插入core data的数据是一个Event对象,title、desc和localTime可以正确显示。

但是localUTC,一个int类型的值,比如我把-2插入核心数据,但是取出后变成-30。更诡异的是,在Event类的实例中,localUTC的值为-2,但在UITextField中显示时却变成了-30

我使用的代码如下:

Event *event = [[utility getAllEvents] lastObject];
NSLog(@"%@", event); // log 1

_eventTitle.text = event.title;
_eventDesc.text = event.desc;
_eventTime.text = [NSString stringWithFormat:@"%@", event.localTime];
NSLog(@"%d", event.localUTC); // log 2
_eventUTC.text = [NSString stringWithFormat:@"%d", event.localUTC];
NSLog(@"%@", event); // log 3
NSLog(@"%d", event.localUTC); // log 4

日志:

2015-01-21 20:13:21.186 EventTest[3695:248822] <NSManagedObject: 0x7fe22a445c60> (entity: Event; id: 0xd000000000200000 <x-coredata://BC13045B-499A-4DE6-828F-3BACCFF56CF0/Event/p8> ; data: <fault>) // log 1: NSLog(@"%@", event); 

2015-01-21 20:13:21.188 EventTest[3695:248822] -30 // log 2: NSLog(@"%d", event.localUTC);

2015-01-21 20:13:21.189 EventTest[3695:248822] <NSManagedObject: 0x7fe22a445c60> (entity: Event; id: 0xd000000000200000 <x-coredata://BC13045B-499A-4DE6-828F-3BACCFF56CF0/Event/p8> ; data: {
    desc = "abcdefg\n\nhhhh\n\nxx\nsd\nd\nfsad\nf";
    localTime = "2015-01-21 08:56:31 +0000";
    localUTC = "-2";
    title = "New event111";
}) // log 3: NSLog(@"%@", event); --NOTICE, the value of localUTC is "-2", but when display, it becomes -30

2015-01-21 20:13:21.189 EventTest[3695:248822] -30 // log 4: NSLog(@"%d", event.localUTC); 

更新

the code Event *event = [[utility getAllEvents] lastObject];

是从 NSManagedObject 强制转换的,这是问题吗? [utility getAllEvents] 返回 NSManagedObject 的 NSArray(应该是)。我是 Core Data 的菜鸟,现在确定这是否会导致问题。

更新 2 使用以下代码解决了问题:

[_eventUTC setText:[NSString stringWithFormat:@"%@", [event valueForKey:@"localUTC"]]];

但我不知道为什么它解决了问题,任何人都可以指出它?

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    即使核心数据模型(您的 .xcdatamodeld 文件)具有 Integer 16 / 32 /64 等属性,这些值也存储在 NSNumber 对象中。因此,您需要通过 NSNumber 对象访问您的数字值。

    【讨论】:

      【解决方案2】:

      如果您仔细查看NSLog(@"%@", event); 的输出,您会发现localUTCNSString

      localUTC = "-2";

      在您的另一个日志语句中,您使用%d format specifier,它用于整数类型,而不是字符串。

      NSLog(@"%d", event.localUTC);
      

      把这个改成

      NSLog(@"%@", event.localUTC);
      

      或者,如果您对整数值感兴趣

      NSLog(@"%d", [event.localUTC integerValue]);
      

      【讨论】:

      • 说到localUTC,在设置该属性时,我使用这种方法:[newEvent setValue:[NSNumber numberWithInt:event.localUTC] forKey:@"localUTC"];这个方法不对吗?
      • 另外一个问题是,在对象日志中,“localTime = "2015-01-21 08:56:31 +0000";"这是否意味着 localTime 存储为字符串值而不是 NSDate?
      • 我不确定,它也可能是NSDate,但它只是放在引号之间。您可以在Event.h 文件或.xcdatamodel 文件中检查任何属性的类型。
      • Event.h 指定 localUTC 是一个 int 值,在 .xcdatamodel 中它存储为一个整数 32 值。不知道发生了什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-09
      相关资源
      最近更新 更多