将BLOB插入Sqlite3而非文本

3

我是一个辅助翻译,以下是IT技术相关内容的翻译:

我有一个ACTIVITY实体是这样创建的:

CREATE TABLE ACTIVITY (ID INTEGER PRIMARY KEY, TYPE TEXT, DESCRIPTION TEXT);

我将尝试以以下方式将Activity对象保存在Sqlite3数据库中:
func save(database:COpaquePointer) -> Int
{
    let id = getMaxActivityId(database) + 1;
    let insertQuery = "INSERT INTO ACTIVITY (TYPE, ID, DESCRIPTION) VALUES (?,?,?);"
    var statement:COpaquePointer = nil
    if sqlite3_prepare_v2(database, insertQuery, -1, &statement, nil) == SQLITE_OK
    {
        sqlite3_bind_text(statement, 1,type, -1, nil)
        sqlite3_bind_int(statement, 2, Int32(id))

        sqlite3_bind_text(statement, 3, description ?? "", -1, nil)
    }

    if sqlite3_step(statement) != SQLITE_DONE
    {
        let e = NSException(name: "Failed to insert Activity", reason: nil, userInfo: nil)
        e.raise()
    }
    sqlite3_finalize(statement)
    return id
}

值为:
activity.type = "Walking"
activity.id = 12
activity.description = Optional(nil)

当检索数据时,发现数据不一致。如果我尝试下载应用容器并检查数据库,可以看到在“类型”字段中插入了BLOB类型而不是字符串:enter image description hereenter image description here。如果我尝试将类型更改为“文本”,则会显示此消息:enter image description here。我使用的应用程序是针对Os X的“Sqlite Browser” 3.8.0版本。

1
INSERT语句中键的顺序与CREATE TABLE语句中键的顺序不同,但我认为这并不重要。看起来前4条记录已经正确创建了,你在中间改变了什么吗? - Martin R
@MartinR 是的,DESCRIPTION字段是之后创建的(ALTER TABLE ACTIVITY ADD COLUMN DESCRIPTION TEXT)。 - Ramy Al Zuhouri
奇怪的事实是:如果我不绑定第三个值(描述),类型字段就会被正确插入。 - Ramy Al Zuhouri
描述属性具体是什么类型? - Martin R
这是一个字符串(不可选)。我尝试将其保存为UTF8String,现在没有问题了。 - Ramy Al Zuhouri
显示剩余2条评论
1个回答

8
以后我发现应该将字符串保存为UTF8格式,而不是普通的Swift字符串,否则可能会出现意外行为:
sqlite3_bind_int(statement, 1, Int32(id))
sqlite3_bind_text(statement, 2,(type as NSString).UTF8String, -1, nil)

let desc = (description ?? "") as NSString
sqlite3_bind_text(statement, 3, desc.UTF8String, -1, nil)

我在这个问题中找到了解决方案。


顺便提一句,你应该在 sqlite3_bind_text 的最后一个参数中使用 SQLITE_TRANSIENT - Rob

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