gpt4 book ai didi

ios - iOS 的 SQLite 事务语法

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:19 25 4
gpt4 key购买 nike

我想遍历对象数组并根据 ID 更新 SQLite 数据库中的相应行。我想在一次交易中做到这一点。我知道我可以使用:

sqlite3_exec(db, "BEGIN", 0, 0, 0);
sqlite3_exec(db, "COMMIT", 0, 0, 0);

但是,我不确定如何在事务中编写更新语句。我需要将不同的变量绑定(bind)到语句。现在代码看起来像这样:

-(void)someUpdateMethod
{
sqlite3 *db;

//Establish connection to db
if (sqlite3_open([[self dbFilePath] UTF8String], &db) == SQLITE_OK)
{
const char *query = "UPDATE Table SET Value1 = ?, Value2 = ?";

sqlite3_stmt *compiledStatement = nil;

sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", 0, 0, 0);
for (someObject *obj in uArray)
{
// Repeated statement - This is what I'm not sure of...
if(sqlite3_prepare(db, query, -1, &compiledStatement, NULL) == SQLITE_OK)
{
sqlite3_bind_int(compiledStatement, 1, [obj value1]);
sqlite3_bind_int(compiledStatement, 2, [obj value2]);
}
if (sqlite3_step(compiledStatement) != SQLITE_DONE) NSLog(@"DB not updated. Error: %s",sqlite3_errmsg(db));
if (sqlite3_finalize(compiledStatement) != SQLITE_OK) NSLog(@"SQL Error: %s",sqlite3_errmsg(db));
}
if (sqlite3_exec(db, "COMMIT TRANSACTION", 0, 0, 0) != SQLITE_OK) NSLog(@"SQL Error: %s",sqlite3_errmsg(db));
sqlite3_close(db);
}
else
NSLog(@"sql-error: %s", sqlite3_errmsg(db));
}

无论 Begin 和 Commit 语句如何,每次更新都会访问数据库。我很确定这是因为步骤语句,但如果我删除它,则不会发生更新。我希望一次写入所有更新。是否可以使用 sqlite3_exec 并仍然为数组中的每个对象绑定(bind)变量?或者我应该用不同的方式准备声明吗?交易内部的任何示例都会对我有很大帮助!

最佳答案

您的方法将如您所愿;即使 sqlite 正在访问磁盘,在您提交之前,其他事务也看不到更新。因此,从这个意义上说,它们是“一次全部编写的”。

如果将 prepare 移到循环之外,您的代码会更高效一些。如果这样做,请在循环内使用 sqlite3_reset,并在循环后使用 sqlite3_finalize

  sqlite3_exec(db, "BEGIN EXCLUSIVE TRANSACTION", 0, 0, 0);
if(sqlite3_prepare(db, query, -1, &compiledStatement, NULL) == SQLITE_OK)
{
for (someObject *obj in uArray)
{
sqlite3_bind_int(compiledStatement, 1, [obj value1]);
sqlite3_bind_int(compiledStatement, 2, [obj value2]);
if (sqlite3_step(compiledStatement) != SQLITE_DONE) NSLog(@"DB not updated. Error: %s",sqlite3_errmsg(db));
if (sqlite3_reset(compiledStatement) != SQLITE_OK) NSLog(@"SQL Error: %s",sqlite3_errmsg(db));
}
}
if (sqlite3_finalize(compiledStatement) != SQLITE_OK) NSLog(@"SQL Error: %s",sqlite3_errmsg(db));
if (sqlite3_exec(db, "COMMIT TRANSACTION", 0, 0, 0) != SQLITE_OK) NSLog(@"SQL Error: %s",sqlite3_errmsg(db));
sqlite3_close(db);

关于ios - iOS 的 SQLite 事务语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12133355/

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