iOS SQLite FMDB交易..正确用法?

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)