我有一个以这种方式创建的ACTIVITY实体:
CREATE TABLE ACTIVITY (ID INTEGER PRIMARY KEY, TYPE TEXT, DESCRIPTION TEXT);
我试图以这种方式在Sqlite3数据库中保存一个Activity对象:
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类型而不是字符串:
如果我尝试将类型更改为" text"它显示了这条消息:
我使用的应用是" Sqlite浏览器" Os.0为3.8.0。
答案 0 :(得分: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)
我找到了解决方案from this question。