jim*_*jim 9 sqlite objective-c fmdb ios
我将尝试使用FMDB SQLite iOS包装器进行事务处理.
文档在事务上有点模糊,但是通过快速查看一些函数,我得出了以下逻辑:
[fmdb beginTransaction];
// Run the following query
BOOL res1 = [fmdb executeUpdate:@"query1"];
BOOL res2 = [fmdb executeUpdate:@"query2"];
if(!res1 || !res2) [fmdb rollback];
else [fmdb commit];
Run Code Online (Sandbox Code Playgroud)
小智 18
您还可以使用FMDatabaseQueue来处理您的事务,这是fmdb的一部分:
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:1]];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:2]];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:3]];
if (whoopsSomethingWrongHappened) {
*rollback = YES;
return;
}
// etc…
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", [NSNumber numberWithInt:4]];
}];
Run Code Online (Sandbox Code Playgroud)
Jer*_*myP 16
如果第一次更新失败,我不会尝试进行第二次更新.
bool ret = false;
[fmdb beginTransaction];
ret = [fmdb executeUpdate:@"query1"];
if (ret)
{
ret = [fmdb executeUpdate:@"query2"];
if (!ret)
{
// report error 2
}
}
if(ret)
{
if (![fmdb commit])
{
// panic!
}
}
else
{
if (![fmdb rollback])
{
// panic!
}
}
Run Code Online (Sandbox Code Playgroud)
对于偏执的健壮性,你应该有一个try ... catch块以防万一抛出异常.如果你这样做,你可以利用它.
[fmdb beginTransaction];
@try
{
if (![fmdb executeUpdate:@"query1"])
{
// report error
@throw someExcpetion;
}
if (![fmdb executeUpdate:@"query2"])
{
// report error
@throw someExcpetion;
}
[fmdb commit]
}
@catch(NSException* e)
{
[fmdb rollback];
// rethrow if not one of the two exceptions above
}
Run Code Online (Sandbox Code Playgroud)