如何使用锁定/解锁?

时间:2018-05-20 04:18:21

标签: ios objective-c database sqlite

以下是使用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 个答案:

答案 0 :(得分:0)

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

query_str访问权限在锁定之外,因此无法防止并发修改。是否可能在您的计划中发生这种情况,只有您可以决定。