我正在开发一个处理来自 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中的空值。
这样做有什么缺点吗?
答案 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;
}