Gab*_*ega 2 sqlite syntax transactions ios sql-update
我想循环遍历一个对象数组,并根据ID更新SQLite数据库中的相应行.我想在一次交易中这样做.我知道我可以用:
sqlite3_exec(db, "BEGIN", 0, 0, 0);
sqlite3_exec(db, "COMMIT", 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何在事务内部编写更新语句.我需要将不同的变量绑定到语句中.现在代码看起来像这样:
-(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));
}
Run Code Online (Sandbox Code Playgroud)
无论Begin和Commit语句如何,数据库都在每个Update上访问.我很确定这是因为step语句,但是如果我删除它就不会发生更新.我希望所有更新都能立刻写完.是否可以使用sqlite3_exec并仍为数组中的每个对象绑定变量?或者我是否应该采用不同的方式来准备声明?交易内部应该是什么样子的任何例子都对我有很大的帮助!
Dou*_*rie 13
您的方法将按您的意愿工作; 即使sqlite正在访问磁盘,在您提交之前,其他事务也不会看到更新.因此,从这个意义上讲,它们是"一次性写下来的".
如果将准备移到循环外,您的代码可以更有效.如果这样做,请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);
Run Code Online (Sandbox Code Playgroud)