代码之家  ›  专栏  ›  技术社区  ›  James Chan

如何使用锁定/解锁?

  •  1
  • James Chan  · 技术社区  · 6 年前

    下面是使用SQLite的代码。

    此函数将由一些线程调用。

    我不太清楚,下面的代码是否正确。

    有锁定/解锁代码。

    请告知我是否正确使用了锁定/解锁。

    - (NSMutableArray*) Query:(NSString *)query_str forColumn:(NSString*)mycolumn
    {
        sqlite3_stmt *statement;
        const char *query_stmt = [query_str UTF8String];
    
        [dbLock lock];
    
        if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) != SQLITE_OK) {
            [dbLock unlock];
            return nil;
        }
    
        NSMutableArray  *queryResult = [NSMutableArray array];
    
        while (sqlite3_step(statement) == SQLITE_ROW) {
    
            NSMutableDictionary * dict = [[NSMutableDictionary alloc] init];
    
            int num_of_fields = sqlite3_column_count(statement);
            for (int i = 0; i < num_of_fields; i++) {
    
                NSString * col_name = [[NSString alloc] initWithUTF8String:sqlite3_column_name(statement, i)];
    
                const char * value = (const char *)sqlite3_column_text(statement, i);
                NSString * col_text;
    
                if (value)
                    col_text = [[NSString alloc] initWithUTF8String:value];
                else
                    col_text = @"";
    
                if (col_name && col_text) {
                    if ([col_text isEqualToString:@"--"] == NO && [col_text isEqualToString:@""] == NO)
                        [dict setObject:col_text forKey:col_name];
                }
            }
            if (mycolumn == nil) {
                [queryResult addObject:dict];
            } else {
                NSString *tmp = [dict objectForKey:mycolumn];
                if (tmp != nil) {
                    [queryResult addObject:tmp];
                }
            }
        }
    
        sqlite3_finalize(statement);
    
        [dbLock unlock];
    
        return queryResult;
    }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   CL.    6 年前

    锁定是围绕所有数据库访问函数进行的,因此只要所有其他数据库访问代码也执行类似的锁定,数据库就会受到保护。

    这个 query_str 访问权限在锁之外,因此不受并发修改的保护。这是否会发生在你的项目中,只有你自己能决定。