下面是使用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; }
锁定是围绕所有数据库访问函数进行的,因此只要所有其他数据库访问代码也执行类似的锁定,数据库就会受到保护。
这个 query_str 访问权限在锁之外,因此不受并发修改的保护。这是否会发生在你的项目中,只有你自己能决定。
query_str