代码之家  ›  专栏  ›  技术社区  ›  Crystal

保持FMDB线程的安全

  •  5
  • Crystal  · 技术社区  · 13 年前

    我在FMDB2.0中看到,作者为线程添加了FMDatabaseQueue。例如:

    // First, make your queue.
    
    FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
    Then use it like so:
    
    [queue inDatabase:^(FMDatabase *db) {
        [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]];
    
        FMResultSet *rs = [db executeQuery:@"select * from foo"];
        while ([rs next]) {
            …
        }
    }];
    // An easy way to wrap things up in a transaction can be done like this:
    
    [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]];
    }];
    

    有两个问题,databaseQueueWithPath参数应该是什么?这就是我的数据库所在的路径吗?

    第二个问题,我可以看到,如果你有多个更新,并且你不希望它们互相践踏,这将如何工作。但是,如果你正在将数据插入数据库,但又想访问数据库中的其他数据,这样用户在插入数据时仍然可以玩你的应用程序,那该怎么办。这可能吗?谢谢

    1 回复  |  直到 11 年前
        1
  •  2
  •   ccgus    13 年前

    是的,databaseQueueWithPath:获取数据库的路径。

    对于你的第二个问题,如果你在后台线程中插入数据,并且你可以将其分成块(所以在[queue-inDatabase:]中花费的时间不会很长),那么是的,在这期间,你仍然可以玩这个应用程序。当一个应用程序已经在使用时,你将无法使用各种队列方法。

    推荐文章