在我的iPhone應用程序,我使用的SQLite數據庫,併爲我依靠fmdb。 在與iOS5的iPhone,即初始DB訪問需要,在最大,10S,但在iOS 6花費30秒和2m40s之間(這在iPhone 4和4S,iPhone上5約需15-20s)。我注意到的一件事是,時間總是一致的,如果在一部手機上花60秒,它總是會花費60秒。爲什麼在iOS6上訪問SQLite數據庫需要更長的時間?
沒有任何理由在iOS 6中使用FMDB的比對iOS 5的慢?有沒有更好的替代fmdb?
在代碼方面,這裏有一個樣品我在做什麼:
獲取數據
+ (NSMutableArray*) getLevadas
{
FMDatabase *db = [DBAdapter getDB];
if([db open])
{
FMResultSet *result = [db executeQuery:@"SELECT Levada.Levada_id, Levada.Nome, a.Nome as Inicio, b.Nome as Fim, Dificuldade.NomePT as DificuldadePT, Dificuldade.NomeES as DificuldadeES, Dificuldade.NomeEN as DificuldadeEN, Altitude, Distancia, DescricaoPT, DescricaoEN, DescricaoES, Latitude, Longitude, Autocarro, Levada.dataModificado, a.Sector, Levada.Duracao, b.Sector as SectorFim, GROUP_CONCAT(DISTINCT PalavrasChave.NomePT) as PalavrasChavePT, GROUP_CONCAT(DISTINCT PalavrasChave.NomeEN) as PalavrasChaveEN, GROUP_CONCAT(DISTINCT PalavrasChave.NomeES) as PalavrasChaveES, GROUP_CONCAT(DISTINCT Equipamento.NomeEN) as EquipamentoEN, GROUP_CONCAT(DISTINCT Equipamento.NomePT) as EquipamentoPT, GROUP_CONCAT(DISTINCT Equipamento.NomeES) as EquipamentoES, Levada.Coordenadas, Levada.LongitudeFim, Levada.LatitudeFim, Levada.PontosInteresse, GROUP_CONCAT(DISTINCT Fotos.url) as Fotos FROM Levada, Localizacoes as a, Localizacoes as b, Dificuldade, Levada_has_PalavrasChave, PalavrasChave, Levada_has_Equipamento, Equipamento, Fotos WHERE ((Inicio_id = a.Localizacoes_id) AND (Fim_id = b.Localizacoes_id) AND (Levada.Dificuldade_id = Dificuldade.Dificuldade_id) AND (Levada.Levada_id = Levada_has_PalavrasChave.Levada_id) AND (PalavrasChave.PalavrasChave_id = Levada_has_PalavrasChave.PalavrasChave_id) AND (Levada.Levada_id = Levada_has_Equipamento.Levada_id) AND (Levada_has_Equipamento.Equipamento_id = Equipamento.Equipamento_id) AND Levada.Levada_id = Fotos.idLevada) GROUP BY Levada.Levada_id ORDER BY Levada.Nome;"];
NSMutableArray *levadas = [[NSMutableArray alloc] init];
while ([result next])
{
Levada *l = [[Levada alloc] init];
[l ID:[NSNumber numberWithInt: [result intForColumn:@"Levada_id"]]];
[l Nome:[result stringForColumn:@"Nome"]];
[l Dificuldade:[result stringForColumn:[NSString stringWithFormat:@"Dificuldade%@", NSLocalizedString(@"lingua", NULL)]]];
[l Distancia:[result objectForColumnName:@"Distancia"]];
[l Duracao:[result stringForColumn:@"Duracao"]];
[l Inicio:[result stringForColumn:@"Inicio"]];
[l Fim:[result stringForColumn:@"Fim"]];
[l Altitude:[result stringForColumn:@"Altitude"]];
[l PalavrasChave:[[result stringForColumn:[NSString stringWithFormat:@"PalavrasChave%@", NSLocalizedString(@"lingua", NULL)]] stringByReplacingOccurrencesOfString:@"," withString:@", "]];
[l Descricao:[result stringForColumn:[NSString stringWithFormat:@"Descricao%@", NSLocalizedString(@"lingua", NULL)]]];
[l Fotos: [[result stringForColumn:@"Fotos"] componentsSeparatedByString:@","]];
[l Latitude:[NSNumber numberWithDouble:[[result stringForColumn:@"Latitude"] doubleValue]]];
[l LatitudeFim:[NSNumber numberWithDouble:[[result stringForColumn:@"LatitudeFim"] doubleValue]]];
[l Longitude:[NSNumber numberWithDouble:[[result stringForColumn:@"Longitude"] doubleValue]]];
[l LongitudeFim:[NSNumber numberWithDouble:[[result stringForColumn:@"LongitudeFim"] doubleValue]]];
[l Coordenadas:[result stringForColumn:@"Coordenadas"]];
[l Equipamento: [[result stringForColumn:[NSString stringWithFormat:@"Equipamento%@", NSLocalizedString(@"lingua", NULL)]] componentsSeparatedByString:@","]];
[l DataModificado:[result stringForColumn:@"dataModificado"]];
[l Sector: [result stringForColumn:@"Sector"]];
[l SectorFim: [result stringForColumn:@"SectorFim"]];
[l Autocarro: [result stringForColumn:@"Autocarro"]];
[levadas addObject:l];
}
[result close];
[db close];
return levadas;
}
return nil;
}
打開DB
+ (FMDatabase*) getDB
{
[DBAdapter copyDatabaseIfNeeded];
FMDatabase *db = [FMDatabase databaseWithPath:[DBAdapter getDBPath]];
[db setLogsErrors:YES];
return db;
}
+ (void) copyDatabaseIfNeeded
{
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSString *dbPath = [DBAdapter getDBPath];
BOOL success = [fileManager fileExistsAtPath:dbPath];
if(!success)
{
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"WalkMe.sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
}
}
+ (NSString *) getDBPath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
return [documentsDir stringByAppendingPathComponent:@"WalkMe.sqlite"];
}
更新:
這裏的時間分析的截圖:
從我可以收集最耗時的是[FMResultSet明]指令,更具體的rc = sqlite3_step([_statement statement]);
的FMDB下一個代碼內。所以我猜猜這個問題真的是SELECT語句。
更新2:
我試過SQL語句簡化爲務必清理項目。SELECT Levada_id FROM Levada
,它仍然需要太多的時間在[FMResultSet明]
你試過[分析](https://developer.apple.com/library/ios/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/AnalysingCPUUsageinYourOSXApp/AnalysingCPUUsageinYourOSXApp.html#//apple_ref/doc/uid/TP40004652-CH16-SW1)您的應用程序查看在此過程中大部分CPU時間花費在哪裏?它可以幫助您在代碼,FMDB或Apple中追蹤問題並報告。 – Joe
我還沒有,但只要我能夠做到這一點,謝謝你提到它 –
這不太可能,但你是從多個隊列/線程訪問數據庫嗎? – Rob