gpt4 book ai didi

ios - SQLite3 并不总是正常工作(无法准备或执行查询)

转载 作者:行者123 更新时间:2023-11-28 08:21:52 25 4
gpt4 key购买 nike

我正在使用 MacMini 进行快速开发,并在 iPhone 6S 上进行测试。

我尝试安装 Sqlite-wrappers(SQLite.swift、fmdb),但它们都让我的应用程序在启动时崩溃了。所以我使用纯 sqlite3-API。

起初我创建了一个指向数据库的指针并将其作为静态变量提供。

static var db: OpaquePointer? = nil
.....
sqlite3_open(fileURL.path, &db)

但我有时会遇到 Bad_Access 崩溃。上网搜了一下。发现“不要在不同线程中使用 1 个指针”。

所以现在我在不同线程中使用 open 语句创建一个指针,始终执行 sqlite3_reset、finalize,然后关闭它。

static func getDBPointer() -> OpaquePointer? {
var db: OpaquePointer? = nil
if sqlite3_open(dbFile, &db) != SQLITE_OK {
print("error opening database")
} else {
print("******************* DB opened")
}
return db
}

这几天工作正常,没有问题,没有 Bad_Access。

但是现在所有的数据库都表现得很奇怪。它工作了一分钟,然后我无法插入或更新行,下一条语句再次工作正常。“从表中删除 *”在大多数情况下都没有问题,但有时会失败。所有 sqlite3_prepare_v2()-Statements 都运行良好,我看不出任何语法问题。在下一次尝试中(相同的语句,所有格式正确且数据正确)我几乎总是得到“无法准备......”

这里是一个简短的代码示例:

let db = getDBPointer()

let insertStatementString = "INSERT INTO vorstellung_info (vorstellung_nr,datum,vorstellung,haus,autor) VALUES (\(vorst_num),\(vorst_datum),'\(vorstellung_name)','\(vorst_haus)','\(vorst_autor)');"

print("Insert vorstellung string: \(insertStatementString)")

var insertStatement: OpaquePointer? = nil

if sqlite3_prepare_v2(db, insertStatementString, -1, &insertStatement, nil) == SQLITE_OK {
if sqlite3_step(insertStatement) == SQLITE_DONE {
print("Done well.")
} else {
print("Could not insert row in vorstellung_info: \(insertStatementString)")
}
} else {
print("INSERT statement to vorstellung_info could not be prepared.")
}
sqlite3_finalize(insertStatement)
sqlite3_close_v2(db)

输出:

Insert vorstellung string: INSERT INTO vorstellung_info (vorstellung_nr,datum,vorstellung,haus,autor) VALUES (45127,1481382000000,'TEST-WantToSee','Thats the place','Interesting author');
Could not insert row in vorstellung_info: INSERT INTO vorstellung_info (vorstellung_nr,datum,vorstellung,haus,autor) VALUES (45127,1481382000000,'TEST-WantToSee','Thats the place','Interesting author');

正如我之前所说:有时甚至 prepare 语句也会失败。

本例的建表语句:

let createVorstellungInfo = "CREATE TABLE IF NOT EXISTS vorstellung_info(" +
"vorstellung_nr INT," +
"datum INT," +
"vorstellung TEXT," +
"haus TEXT," +
"autor TEXT);"

该程序通过 session 与服务器有很多“对话”,因此大多数非选择语句在 session.task 或此类任务调用的静态函数中是异步的。

编辑:

将“String(cString: sqlite3_errmsg(db))”添加到任何可能的位置

“无法准备”:

SELECT statement could not be prepared: SELECT * from rechnung_vorst where rechnung_nr = 9868681 AND vorstellung_nr = 45138;
-------------------------
database is locked

“无法加载”

Veranstalter could not get loaded: SELECT veranstalter_nname, veranstalter_vname, veranstalter_uid, veranstalter_ort, veranstalter_plz, veranstalter_str FROM veranstalter WHERE veranstalter_nr = 2062491;
-------------------------
unknown error

这些只是数十条消息中的两个示例。顺便说一句:我尝试了 4 到 5 次才获得这些消息(全部在一次尝试中)。首先它运行良好,然后出现这些错误,然后再次运行......

最佳答案

多线程 SQLite 很难。这非常有趣,我永远不会说你不应该尝试自己解决这个挑战。但是如果你想把时间花在其他地方,我建议你看看GRDB.swift .它提供比其他库更多的并发保证:http://github.com/groue/GRDB.swift#concurrency

关于ios - SQLite3 并不总是正常工作(无法准备或执行查询),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41062992/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com