【问题标题】:Sqlite3 inserting BLOBs instead of textSqlite3 插入 BLOB 而不是文本
【发布时间】:2016-06-23 06:14:04
【问题描述】:

我有一个以这种方式创建的 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)

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

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

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

【问题讨论】:

  • INSERT 语句中键的顺序与 CREATE TABLE 语句中的键顺序不同,但我认为这并不重要。 – 看起来前 4 条记录是正确创建的,您是否在两者之间进行了更改?
  • @MartinR 是的,DESCRIPTION 字段是在之后创建的(ALTER TABLE Activity ADD COLUMN DESCRIPTION TEXT)。
  • 奇怪的事实:如果我不绑定第三个值(描述),类型字段会被正确插入。
  • description 属性的确切类型是什么?
  • 它的类型是TEXT。

标签: ios swift sqlite


【解决方案1】:

后来我发现我应该将字符串保存为 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)

我找到了解决方案from this question

【讨论】:

  • 顺便说一句,您应该使用SQLITE_TRANSIENT 作为sqlite3_bind_text 的最后一个参数。
猜你喜欢
  • 1970-01-01
  • 2019-02-22
  • 2021-05-29
  • 1970-01-01
  • 2014-12-12
  • 2015-10-29
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多