【问题标题】:Sqlite inserting '(null)' for nil NSStringsSqlite 为 nil NSStrings 插入 '(null)'
【发布时间】:2012-06-16 04:36:51
【问题描述】:

在尝试将记录插入数据库时​​,我利用用户将一些字段留空,即 nil 字符串。现在,当我将数据插入数据库时​​,我在数据源为 nil 的每一列中得到(null)而不是 nil 值。当我从数据库中获取记录并将其显示给用户时,他留空的值现在显示为 (null)。

我可以实现逻辑来检查这个'(null)'字符串,但我想应该有一些方法可以在数据库级别处理它。我的意思是如果我插入一个 nil 值,那么它应该是 nil 或空而不是(null)字符串。谁能帮我解决这个问题? 谢谢

【问题讨论】:

  • 你是得到 null 作为字符串还是得到 null 值???
  • nil 即数据库中没有值 IS NULL - 空字符串是长度为 0 的非 nil NSString
  • 当我检索记录时,我得到 (null) 作为字符串

标签: objective-c ios sqlite


【解决方案1】:

当您使用带有“%@”格式说明符的字符串格式化,并且对应的对象指针值为nil 时,格式化字符串在该位置获得“(null)”。因此,您或您正在使用的库正在这样做。

在字符串格式之外,我不知道有什么会突然产生“(null)”。

【讨论】:

  • 是的,我在 +stringWithFormat 方法中使用 %@ 构建查询。有什么替代方案或解决方案吗?除了检查每个字符串不为零?
  • 您可能必须检查nil。如果字符串参数是 nil,您希望格式化查询的外观如何?
  • 猜我看到了 :)... 嗯,我想用 "" 替换任何 nil 字符串,即长度为零的字符串。行得通吗?
  • 我不知道这是否适用于 SQLite 和您的数据库设计。它可能。您可以执行NSString* value = textField.text; if (!value) value = @""; 之类的操作。或者,格式化时,您可以使用[NSString stringWithFormat"blah %@ blah", (value ? value : @"")]
  • 伟大的肯。我深信它会起作用:)。我会试一试。另一个想法是默认情况下我会用 NULL 值实例化我的 NSStrings,这样我什至可以在格式化字符串时跳过检查。
【解决方案2】:

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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-23
    • 2013-06-14
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    相关资源
    最近更新 更多