何时使用SQLITE_TRANSIENT和SQLITE_STATIC?

23

我想在sqlite3中创建/更新文本列。但是当我检索创建/更新后的行时,文本变成了“?”。然而整数值被正确地保存。

我的文本语句如下:

const char *sql = "INSERT INTO todo(title, description, priority, status, created, expires, posx, posy, updated)"
                  " VALUES('?', '?', '?', '?', '?', '?', '?', '?', '?');";
if (sqlite3_prepare_v2(database, sql, -1, &insert_statment, NULL) != SQLITE_OK)
    ...
sqlite3_bind_text(update_statment, 5, [[dt stringFromDate:self.updated] UTF8String], -1, SQLITE_TRANSIENT);

我已经尝试过使用SQLITE_TRANSIENT和SQLITE_STATIC。但是这两种情况似乎产生了相同的结果(“?”)。我还验证了当文本值传递到适当的SQL语句时,这些文本值是有效的。

有任何想法吗?


你的预处理语句长什么样? - Doug Currie
1个回答

52

在你的SQL字符串中去掉问号周围的单引号。

SQLITE_TRANSIENT表示告诉SQLite复制你的字符串。当你的字符串(的缓冲区)在查询执行之前就会消失时,请使用这个选项。

SQLITE_STATIC表示告诉SQLite您承诺通过字符串传递给指针将在查询执行后保持有效。当您的缓冲区是静态的或至少具有超过绑定范围的动态作用域时,请使用此选项。


2
在Swift中,我如何知道我的字符串什么时候会消失?https://stackoverflow.com/questions/60499265/swift-how-do-i-know-if-my-string-needs-to-be-copied - ma11hew28

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接