【问题标题】:Core Data not saving integer properly? When changing from NSString to int核心数据没有正确保存整数?从 NSString 更改为 int 时
【发布时间】:2012-03-15 17:12:11
【问题描述】:

我正在我的应用程序上使用核心数据,

我在保存一个应该是整数的数字时遇到问题...当我从 Core Data 获取它时,它显示奇怪的数字值

我知道它正在工作,因为在测试中,我的 idTosave = 345,它显示在 CoreData 的结果上,但是当我发送一个值 [string to int] 时,我知道它正在工作,因为它记录了正确的响应,CD 保存一个奇怪的值:

(请注意我保存到实体 idRef)

NSLog(@"resultToDisplay:: %@", self.resultsToDisplay);

//    int idToSave = 345; //if I use this line instead of intValue it saves 345 OK!
int idToSave = (int)[self.resultsToDisplay intValue];


NSLog(@"id salvada as NSINTEGER:: %d",idToSave);



//graba a CD!
[Student insertWithDataQR:[studentDataDicto objectForKey:@"name"] surname:[studentDataDicto objectForKey:@"surname"] 
 phone:[studentDataDicto objectForKey:@""] 
 dob:[studentDataDicto objectForKey:@"dob"] idRef:idToSave ...]];

[[Student defaultManagedObjectContext]save:nil]; 

退出:

 resultToDisplay:: 1329955200
  2012-02-26 00:36:08.597 MyGym_iPad[10867:707] id salvada as NSINTEGER:: 1329955200

注意值 1329955200,在保存前正确显示为整数和字符串,

并检查我所做的响应:

  NSArray *studiantes = [Student all];


for ( Student *tud in studiantes) {
    NSLog(@"tu %@ ...%@",tud.studentName, tud.idRef );
}

所以,使用 int 345,我在日志上看到 tu.idRef == 345

但是使用字符串中的 int,我在日志上看到 tu.idRef == -32384

所以如果我从字符串保存到 int,我得到我的回应:-32384

编辑:

我已对生成的核心数据类管理器文件进行子类化,以将 idRef 保存为 NSNumber

    studentData.idRef = [NSNumber  numberWithInt:idRef];

编辑 x2

检查我做的日志:

NSArray *studiantes = [Student all];


for ( Student *tud in studiantes) {
    NSLog(@"tu %@ ...%d",tud.studentName, [tud.idRef intValue]);
}

但结果是: -32384 ,对于我的值转换为 int,当从字符串保存时

但正确的值 345,刚刚直接发送一个int的时候,

【问题讨论】:

  • 所以如果出于测试目的我发送一个 int ::345,它保存得很好,但是如果发送一个 NSSTring intValue,它就不起作用了,,,,我必须发送一个 int我的课是设计的,谢谢

标签: iphone ios core-data casting


【解决方案1】:

你必须把它放在一个 NSNumber 中:

NSNumber *idToSave = [NSNumber numberWithInteger:[self.resultsToDisplay integerValue]];

编辑

实际上我们已经达到了最大值,用整数 32 字段解决。

【讨论】:

  • 嗨,谢谢,但我发送了一个 Int,在我的实体类中我将 int 更改为 NSNumber,请参阅问题末尾的编辑,谢谢
  • 如果保存在sqlite3 db中,可以尝试用终端直接访问db,看看是否正确保存。使用以下代码获取数据库的路径: NSURL *storeURL = [[self applicationDocumentsDirectory] ​​URLByAppendingPathComponent:@"yourDB.sqlite"]; NSLog(@"Core Data 存储路径 = \"%@\"", [storeURL path]);
  • 嗨,谢谢,我刚刚检查了sqlLite文件,它保存了错误的数据,和注销一样,谢谢
  • 那么 resultToDisplay 的类是什么?
  • 这可能很愚蠢,但尝试将您的字段类型设置为整数 32。值 -32384 让我认为我们已经达到了最大值。或者尝试直接保存1329955200而不是345。
【解决方案2】:

int 值不能是 Objective C id 对象。

要么将您的int 转换为NSString 对象,要么使用NSNumber 对象来包含您的int 值。

【讨论】:

  • 嗨,谢谢,但我已经使用 NSNumber 将核心数据保存到我的 int,请查看编辑,还能是什么?
  • 如果您现在将其保存为NSNumber,那很好。不过,您是如何在NSLog 通话中加载并打印出来的呢?试试NSLog(@"tu %@ ...%d",tud.studentName, [tud.idRef intValue]);
  • 嗨,谢谢,请检查问题的结尾是否有新的编辑,我显示日志正在使用 %d,谢谢
猜你喜欢
  • 2011-08-11
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 2013-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多