【问题标题】:How to pass a value from Cocoa to an SQLite query如何将值从 Cocoa 传递到 SQLite 查询
【发布时间】:2009-12-07 11:28:24
【问题描述】:

首先,请允许我说我对 Objective C 开发还很陌生。我正在为 iphone 编写一个供个人使用的小应用程序,但我在执行以下代码时遇到了一些问题:

NSString *sql = [[NSString alloc] initWithFormat:@"select color_r, color_g, color_b from Calendar where ROWID = %@", [calendarsID objectForKey:[arrayColors objectAtIndex:row]]];

sqlite3_stmt *selectstmt;

if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK)

编译器告诉我,我正在从不兼容的指针类型传递 sqlite3_prepare_v2 的参数 2。无论如何,该程序已编译并运行,但是当它必须执行我刚刚向您展示的代码时,它会产生错误。它说查询中有语法错误,语法错误只是在查询的最后一部分。而不是:

从 ROWID = 63 的日历中选择 color_、color_g、color_b(例如)

我在最后一个数字 (63) 的位置出现了奇怪的字符。我想这是与字符串转换有关的问题。有谁能帮帮我吗?

非常感谢您的关注。 阿莱西奥

【问题讨论】:

  • Ewww...为什么你直接反对SQLite API?首先,CoreData 比 API 更易于使用,并且在设备上原生支持。其次,正如 Dave 所建议的,有一堆包装器。
  • 我告诉过你我没那么有经验。你知道有什么好的网站可以让我获得关于 SQLite 包装器和/或 CoreData 的文档(和示例)吗?谢谢。

标签: objective-c cocoa sqlite nsstring


【解决方案1】:

问题是NSString 不是sqlite3_prepare_v2() 所期望的第二个参数。它想要一个const char*。 C 在这里有点松懈,它允许您将 NSString* 隐式转换为 const char*,这是错误的 - 编译器会给您一个警告,您不应该忽略它。

您需要将NSString 转换为const char*。最简单的方法是使用-UTF8String 消息将其转换为UTF-8:

//                              V---- HERE ----V
if(sqlite3_prepare_v2(database, [sql UTF8String], -1, &selectstmt, NULL) == SQLITE_OK)

或者,如果您想使用不同的编码,您可以使用-cStringUsingEncoding: 消息将字符串转换为使用特定字符编码的 C 字符串。

【讨论】:

  • 非常感谢,这正是我想要的,现在它可以正常工作了。 Tnx ;-)
【解决方案2】:

我认为您的主要问题是您直接使用 sqlite C api instead of a wrapper

【讨论】:

    【解决方案3】:

    您为什么不使用 SQLite 的value binding API 之一?该语句看起来像

    SELECT color_r, color_g, color_b FROM Calendar WHERE ROWID = ?;
    

    您可以将参数直接传递给 SQLite,以便它安全地插入到查询中。这将保护您免受 SQL 注入攻击。 (您展示的示例可能是一个安全的示例,具体取决于这些值最终来自何处,但使用sprintfstringWithFormat: 构造SQL 查询是一个非常非常糟糕的习惯进入。不要被Little Bobby Tables搞砸了。)

    至于你为什么会遇到这个问题,SQLite 不接受像 NSString * 这样的 Cocoa 类型。当您切换到使用 SQLite 格式化查询时,您将能够从其文档中了解您应该使用哪种类型。然后,您可以询问有关如何执行该转换的另一个问题。

    【讨论】:

    • 我同意你的观点,但正如我已经说过的,我不是这些 API 方面的专家,也不是编程语言方面的专家。无论如何,在我的情况下,输入是安全的,因为它不是来自用户,但为了更安全,我将按照您的建议实现值绑定。 Tnx ;-)
    • 值绑定也快得多。通常快三倍。
    【解决方案4】:

    阿莱西奥,

    稍微详细一点会更容易回答这个问题。例如,arrayColors 中有哪些类型的对象?

    如果 arrayColors 中的对象不是 NSStrings,那么你想调用一个方法(例如描述)来创建一个 NSString 表示。

    亚伦

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-02
      相关资源
      最近更新 更多