Как использовать блокировку / разблокировку? - PullRequest
0 голосов
/ 20 мая 2018

Вот код, который использует 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 голосов
/ 20 мая 2018

Блокировка распространяется на все функции доступа к базе данных, поэтому, пока все другие коды доступа к базе данных также выполняют аналогичную блокировку, база данных защищена.

Доступ query_str находится вне блокировки, поэтомуон не защищен от одновременных изменений.Может ли это произойти в вашей программе - решать только вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...