0

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

处理数据库服务器返回的空数值的最佳方法是什么?由于 nil 不能插入到NSDictionary 中,我尝试了几种解决方案,例如关联对象将NSNumber “标记”为NULL,使用[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 中的空值。

这样做有什么缺点吗?

4

2 回答 2

0

我会创建不同的 NaN 数:

[NSDecimalNumber notANumber]

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

但除此之外,我认为还可以。

于 2013-08-14T07:35:13.717 回答
0

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

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

}

于 2013-08-14T09:04:14.650 回答