SQLite3插入BLOB而不是文本

Ram*_*uri 3 sqlite ios swift

我有一个以这种方式创建的ACTIVITY实体:

CREATE TABLE ACTIVITY (ID INTEGER PRIMARY KEY, TYPE TEXT, DESCRIPTION TEXT);
Run Code Online (Sandbox Code Playgroud)

我正在尝试通过以下方式将活动对象保存在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
}
Run Code Online (Sandbox Code Playgroud)

值是:

activity.type = "Walking"
activity.id = 12
activity.description = Optional(nil)
Run Code Online (Sandbox Code Playgroud)

检索数据时似乎不一致,并且如果我尝试下载应用程序容器并检查数据库,我可以看到在类型字段中,插入的是BLOB类型而不是字符串:

在此处输入图片说明 在此处输入图片说明

如果我尝试将类型更改为“文本”,则会显示以下消息:

在此处输入图片说明

我使用的应用是Os X的“ Sqlite Browser” 3.8.0。

Ram*_*uri 5

后来我发现我应该将字符串另存为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)
Run Code Online (Sandbox Code Playgroud)

我已经从这个问题中找到了解决方案。