NSNumber和MySQL NULL值

时间:2013-08-14 06:43:03

标签: objective-c null nsnumber

我正在开发一个处理来自 MySQL 数据库服务器的记录的Mac OS X应用程序。 我在 MySQL C API 的帮助下获取数据,并为结果创建 NSMutableArray 。每个获取的记录都会创建 NSDictionary ,并将其添加到 NSMutableArray

处理数据库服务器返回的空数值的最佳方法是什么? 由于nil无法插入 NSDictionary ,我尝试了几个解决方案,如关联对象,将 NSNumber “标记为 NULL ,使用< strong> [NSNull null] ,甚至是子类 NSNumber 。但是我找到的最简单的解决方案是创建一个 NSNumber ,其零值为零除以零,如下所示:

// for each row in the MySQL result check the field type and create the ObjC value
...
case MYSQL_TYPE_DOUBLE: {
  if (row[col] == NULL) {   // row is the last fetched MYSQL_ROW
    [record setObject:[NSNumber numberWithDouble:0.0/0.0] forKey:columnNames[col]];
  } else {
    [record setObject:@(strtod(row[col], NULL)) forKey:columnNames[col]];
  }
  break;
}
...

这样可以轻松测试NSDecimalNumber的notANumber属性以及使用
NSNumberFormatter的notANumberSymbol用于格式化UI中的空值。

这样做有什么缺点吗?

2 个答案:

答案 0 :(得分:0)

我会创建不同的NaN号码:

[NSDecimalNumber notANumber]

如果我记得标准正确,则除以零会导致未定义状态。

但除此之外,我认为,没关系。

答案 1 :(得分:0)

由于您正在使用关联数组,因此不需要将其设置为nil,跳过该键会导致该键的返回对象为nil,与notANumber相比,这需要较少的代码进行比较。像这样:

 case MYSQL_TYPE_DOUBLE: {
    if (row[col])
      [record setObject:@(strtod(row[col], NULL)) forKey:columnNames[col]];
    }
    break;

}