以下是使用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;
}
答案 0 :(得分:0)
锁定在所有数据库访问函数周围,因此只要所有其他数据库访问代码也执行类似的锁定,数据库就会受到保护。
query_str
访问权限在锁定之外,因此无法防止并发修改。是否可能在您的计划中发生这种情况,只有您可以决定。