Процесс обновления моего приложения захватывает данные из трех отдельных источников (например, Twitter, Facebook и Google). Мы обновляем каждый в отдельном потоке по соображениям производительности и хотим, чтобы каждый из них имел свою собственную транзакцию SQLite, так как мы можем обрабатывать ~ 500 элементов одновременно, что может занять несколько секунд.Отдельные транзакции SQLite в нескольких потоках
Есть ли способ начать новую транзакцию в потоке, который не «вмешивается» в взаимодействие с другими потоками базы данных?
TLDR: Есть ли у вас несколько транзакций SQLite для разных потоков?
Update: Например, рассмотрим следующий код:
@implementation Update
- (void)prepareUpdate {
[self update:@"Twitter"];
[self update:@"Facebook"];
[self update:@"Google"];
}
- (void)update:(NSString *)platform {
dispatch_queue_t newThread = dispatch_queue_create("newThread", NULL);
dispatch_async(newThread, ^{
NSDictionary * data = [Platform getData:platform];
[_db beginTransaction];
for (id item in data) {
[Platform update:platform withData:item];
}
[_db endTransaction];
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"Update complete!");
});
});
}
@end
, который будет генерировать следующее сообщение об ошибке:
Error whilst preparing query: cannot start a transaction within a transaction
Возможно, я использовал бы функцию '@ syncrhonized' для доступа к базе данных и отправки всех транзакций через один и тот же объект. –
. Я не хочу, чтобы централизованная точка запроса выполнялась, поскольку пользователь все равно должен использовать приложение/database, в то время как обновления выполняются в фоновом режиме. – cjhill