首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS SQLite FMDB事务..正确的用法?

iOS SQLite FMDB事务..正确的用法?
EN

Stack Overflow用户
提问于 2011-07-05 17:06:19
回答 4查看 12.2K关注 0票数 9

我只想在FMDB SQLite iOS包装器中尝试使用事务。

文档对事务的描述有点模糊,但通过快速查看一些函数,我得出了以下逻辑:

代码语言:javascript
复制
[fmdb beginTransaction];
    // Run the following query
    BOOL res1 = [fmdb executeUpdate:@"query1"];
    BOOL res2 = [fmdb executeUpdate:@"query2"];

if(!res1 || !res2) [fmdb rollback];
else [fmdb commit];
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-07-05 17:44:55

如果第一次更新失败,我不会尝试进行第二次更新。

代码语言:javascript
复制
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!
    }
}

对于偏执狂的健壮性,你应该试一试...catch块,以防任何东西抛出异常。如果你这样做了,你可以把它用在你的优势上。

代码语言:javascript
复制
[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
}
票数 16
EN

Stack Overflow用户

发布于 2013-01-27 07:01:42

您还可以使用FMDatabaseQueue来处理事务,这是fmdb的一部分:

代码语言:javascript
复制
[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]];
}];

Documentation

票数 18
EN

Stack Overflow用户

发布于 2015-10-30 16:52:51

Swift方式:

代码语言:javascript
复制
let queue = FMDatabaseQueue(path: databaseURL.path!)

queue.inTransaction() {
    db, rollback in

    result = db.executeUpdate("INSERT INTO client VALUES (NULL, ?)", client.name ?? "")

    if result {
        client.ID = Int(db.lastInsertRowId())
    } else {
        rollback.initialize(true)
        print("\(__FUNCTION__) insert into table failed: \(db.lastErrorMessage())")
    }
}

queue.close()
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6580259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档