swift - 使用 Swift 的 Sqlite3 数据库的问题
问题描述
我一直在试图弄清楚我的逻辑。我执行以下操作来打开我的数据库:
func createDB() -> OpaquePointer?{
var db : OpaquePointer?
guard sqlite3_open(path, &db) == SQLITE_OK else {
print("error opening database")
sqlite3_close(db)
db = nil
return nil
}
return db
}
然后我尝试执行以下select
语句:
let queryString = "select photo_id from unsplash_photos"
var statement: OpaquePointer?
if(sqlite3_prepare_v2(db, queryString, -1, &statement, nil)) != SQLITE_OK {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing select: \(errmsg)")
}
var rc = sqlite3_step(statement)
while rc == SQLITE_ROW {
print("row",rc)
rc = sqlite3_step(statement)
}
当它运行时,结果是每一步打印 100。
row 100
row 100
row 100
row 100
row 100
row 100
row 100
row 100
row 100
这与数据库的设置方式有关吗?这与桌子的位置有关吗?
解决方案
是的,它告诉你它找到了 9 行数据,每次都返回SQLITE_ROW
( )。100
如果要提取数据,则必须调用sqlite3_column_xxx()
以获取相应行的数据。例如,sqlite3_column_int
如果photo_id
是整数:
let queryString = "select photo_id from unsplash_photos"
var statement: OpaquePointer?
guard sqlite3_prepare_v2(db, queryString, -1, &statement, nil) == SQLITE_OK else {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("error preparing select: \(errmsg)")
return
}
var rc = sqlite3_step(statement)
// as long as there's a row of data returned, display it
while rc == SQLITE_ROW {
let id = sqlite3_column_int(statement, 0)
print("id =", id)
rc = sqlite3_step(statement)
}
// at the end, we should have gotten `SQLITE_DONE`, and if not, show the error
if rc != SQLITE_DONE {
let errmsg = String(cString: sqlite3_errmsg(db)!)
print("rc =", rc, "error = ", errmsg)
}
// clean up when we're done
sqlite3_finalize(statement)
推荐阅读
- keras - 带 seq2seq LSTM 的多步时间序列预测
- android - Android 拦截来自 WebView 的响应正文和标头?
- ios - 如何在相应部分下实现日历?
- perl - 使用内联哈希定义 Perl while() = 每个 {} 循环
- json - 如何使用不同的对象发出这个 POST 请求?
- node.js - 如何将相同的消息广播到 Mosca 中的多个接口
- python - scrapy-splash 活动内容选择器适用于 shell 但不适用于蜘蛛
- python - 当 Python 3 的 names=True 时,Numpy genfromtxt 似乎不起作用
- javascript - 基于另一个值打印一个值的对象
- wordpress - 产品图片未在 woocommerce 中显示