Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c iOS SQLite FMDB事务。。正确用法?_Objective C_Ios_Sqlite_Fmdb - Fatal编程技术网

Objective c iOS SQLite FMDB事务。。正确用法?

Objective c iOS SQLite FMDB事务。。正确用法?,objective-c,ios,sqlite,fmdb,Objective C,Ios,Sqlite,Fmdb,我将尝试使用带有FMDB SQLite iOS包装器的事务 文档对事务的描述有点模糊,但通过快速查看一些函数,我得出了以下逻辑: [fmdb beginTransaction]; // Run the following query BOOL res1 = [fmdb executeUpdate:@"query1"]; BOOL res2 = [fmdb executeUpdate:@"query2"]; if(!res1 || !res2) [fmdb rollbac

我将尝试使用带有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];

这似乎是一个有效的使用场景,在执行回滚之前,我可能会在其中添加输出
-lastErrorMessage
-lastErrorCode
的值,以便您了解到底出了什么问题

更好的是,在每个
-executeUpdate
之后进行这些调用,这样您就可以知道在每个语句之后是否发生了错误:

[fmdb beginTransaction];

// Run the following query
BOOL res1 = [fmdb executeUpdate:@"query1"];
if (!res1) {
   NSLog(@"Error %d - %@", [fmdb lastErrorMessage], [fmdb lastErrorCode]);
}

BOOL res2 = [fmdb executeUpdate:@"query2"];
if (!res2) {
   NSLog(@"Error %d - %@", [fmdb lastErrorMessage], [fmdb lastErrorCode]);
}

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

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

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块,以防任何东西引发异常。如果你这样做,你可以利用它为你的优势

[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
}

您还可以使用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]];
}];
快捷方式:

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()

内服很有帮助。谢谢你,伙计。没有人提到过错误发生的人来自哪里……这有一个缺点。您无法控制beginTransaction和commit方法。它们的返回值。如果BeginTransaction(内部使用)返回false怎么办?你不能控制它