在尝试将记录插入数据库时,我利用用户将一些字段留空,即 nil 字符串。现在,当我将数据插入数据库时,我在数据源为 nil 的每一列中得到(null)而不是 nil 值。当我从数据库中获取记录并将其显示给用户时,他留空的值现在显示为(null)。
我可以实现逻辑来检查这个'(null)'字符串,但我想应该有一些方法可以在数据库级别处理它。我的意思是如果我插入一个 nil 值,那么它应该是 nil 或空而不是(null)字符串。谁能帮我解决这个问题?谢谢
在尝试将记录插入数据库时,我利用用户将一些字段留空,即 nil 字符串。现在,当我将数据插入数据库时,我在数据源为 nil 的每一列中得到(null)而不是 nil 值。当我从数据库中获取记录并将其显示给用户时,他留空的值现在显示为(null)。
我可以实现逻辑来检查这个'(null)'字符串,但我想应该有一些方法可以在数据库级别处理它。我的意思是如果我插入一个 nil 值,那么它应该是 nil 或空而不是(null)字符串。谁能帮我解决这个问题?谢谢
当您使用带有“%@”格式说明符的字符串格式,并且相应的对象指针值为nil
时,格式化的字符串在该位置获得“(null)”。因此,您或您正在使用的库正在这样做。
在字符串格式之外,我不知道任何会突然产生“(null)”的东西。
Ken Thomases 的回答是正确的,因为您正在"(null)"
退出数据库,因为您在"(null)"
没有意识到的情况下将其放入数据库。
我只是想补充一点,当您将记录插入数据库时,您可以确保将可选字符串作为NULL
值插入,如下所示:
let nullableStringValue: String
if let stringValue = myObject.myOptionalProperty {
nullableStringValue = "'\(stringValue)'"
} else {
nullableStringValue = "NULL"
}
let insertStatement = "INSERT INTO MyTable (MyNullableColumn) VALUES (\(nullableStringValue))"
// proceed to execute the insert statement
然后,当您查询数据库时,您可以读取可能为 null 的值,如下所示:
let myNullableColumnText: String?
if let myNullableColumnTextPointer = sqlite3_column_text(compiledSelectStatement, columnIndex) {
myNullableColumnText = String(cString: myNullableColumnTextPointer)
} else {
myNullableColumnText = nil
}