Ошибка sqlite3_prepare_v2 – Уже выполняется предыдущий запрос

Я написал запрос, который запускается в viewWillAppear . При возвращении на этот экран с быстрой навигацией происходит сбой в sqlite3_prepare_v2 .
Я предполагаю, что авария связана с тем, что предыдущий запрос не был доработан.
Я вызываю операцию базы данных с помощью dispatch_async поскольку я впервые обновляю удаленные данные, а затем сохраняю их в базе данных.
Код выглядит так:

 dispatch_queue_t myQueue = dispatch_queue_create("My Queue",NULL); dispatch_async(myQueue, ^{ [self parseActivityResponse:data]; // Sqlite operation here dispatch_async(dispatch_get_main_queue(), ^{ // Update the UI if(loaderImageview) [loaderImageview removeFromSuperview]; [tableActivities reloadData]; }); }); 

Запрос выглядит следующим образом:

 - (NSMutableArray*)GetAllInvitations:(NSString*)ActivityId { NSMutableArray *arrInvitations = [[NSMutableArray alloc]init]; sqlite3_stmt *statement = nil; @try { const char *sql = "SELECT * FROM Invitation where ActivityId = ?"; if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) { sqlite3_bind_text(statement, 1, [ActivityId UTF8String], -1, SQLITE_TRANSIENT); while (sqlite3_step(statement) == SQLITE_ROW) { char *dbString; Invitation *invitation = [[Invitation alloc]init]; dbString = (char *)sqlite3_column_text(statement, 0); NSString *Id = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; [invitation setId:Id]; dbString = (char *)sqlite3_column_text(statement, 1); NSString *childName = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; [invitation setChildName:childName]; dbString = (char *)sqlite3_column_text(statement, 2); NSString *response = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; [invitation setResponse:response]; dbString = (char *)sqlite3_column_text(statement, 3); NSString *invitationId = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; [invitation setInvitationId:invitationId]; dbString = (char *)sqlite3_column_text(statement, 4); NSString *isCoGaurdian = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; [invitation setIsCoGaurdian:isCoGaurdian]; dbString = (char *)sqlite3_column_text(statement, 5); NSString *activityId = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; [invitation setActivityId:activityId]; dbString = (char *)sqlite3_column_text(statement, 6); NSString *picture = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; [invitation setPicture:picture]; dbString = (char *)sqlite3_column_text(statement, 7); NSString *invitationUserId = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; [invitation setInvitedUserId:invitationUserId]; dbString = (char *)sqlite3_column_text(statement, 8); NSString *roleId = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; [invitation setRoleId:roleId]; dbString = (char *)sqlite3_column_text(statement, 9); NSString *status = (dbString) ? [NSString stringWithUTF8String:dbString] : @""; [invitation setStatus:status]; [arrInvitations addObject:invitation]; } } else { NSLog(@"Failed to create table: %s", sqlite3_errmsg(database)); } } @catch (NSException *exception) { NSLog(@"Error in GetAllInvitations : %@", exception.description); } @finally { sqlite3_finalize(statement); } return arrInvitations; } - (NSMutableArray*)GetAllActivities{ NSMutableArray *arrProjects = [[NSMutableArray alloc]init]; sqlite3_stmt *statement = nil; @try { const char *sql = "SELECT * FROM Activity"; if (sqlite3_prepare_v2(database, sql, -1, &statement, NULL) == SQLITE_OK) { NSLog(@"success"); while (sqlite3_step(statement) == SQLITE_ROW) { ......... activity.arrInvitations = [self GetAllInvitations:activityId]; [arrProjects addObject:activity]; } } else { NSLog(@"Prepare-error #%i: %s", sqlite3_prepare_v2(database, sql, -1, &statement, NULL), sqlite3_errmsg(database)); } } @catch (NSException *exception) { NSLog(@"Error in GetAllActivities : %@", exception.description); } @finally { sqlite3_finalize(statement); } return arrProjects; } 

Я вызываю GetAllActivities из viewWillAppear :

 -(void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self reloadData]; } -(void)reloadData { [self getRemoteActivities:^(BOOL finished) { if(finished){ if([TGProjectHandler hasExistingSession]) { [self getActivities]; } else [self login]; } }]; } 

Ваши мысли и решения?

2 Solutions collect form web for “Ошибка sqlite3_prepare_v2 – Уже выполняется предыдущий запрос”

Создайте очередную очередь с помощью:

 dispatch_queue_t myQueue = dispatch_queue_create("My Queue", DISPATCH_QUEUE_SERIAL); 

и это должно управлять последовательным доступом к базе данных.

Одна вещь, которую я замечаю, – это viewWillAppear вы вызываете метод getActivities но вы вставляете тело GetAllActivities . Это длинный выстрел, но вы уверены, что правильно называете свой метод GetAllActivities ? И откуда GetAllInvitations метод GetAllInvitations ?

  • libsqlite в симуляторе и компиляции iOS
  • Ошибка SQLite3 - iOS
  • Проверить Если столбец уже существует, и если нет Alter Table в sqlite
  • Почему я получаю ошибку SQLITE_MISUSE: ошибка в памяти?
  • Вьетнамский текстовый поиск в Юникоде в SQLite
  • Есть ли эквивалент sqlite .dump в объекте-c?
  • Невозможно подключить базу данных SQLite в iOS
  • конвертировать базу данных sqlite в nsdata и обратно
  • Обновление новой версии для магазина приложений с использованием другой структуры db sqlite
  • Получить данные nsdata из базы данных sqlite и просмотреть их в webView
  • Запрос Sqlite с вопросительным знаком
  • PhoneC: Разработка iOS проста с помощью XCode, Swift3, UITableView, cocatouch, давайте создадим приложения для iPhone, iPad и Macbook.