Comment insérer 40000 rapidement les enregistrements dans une base de données sqlite dans un iPad

Je veux insérer 40000 enregistrements que je l'obtenir à partir d'un service web dans une base de données sqlite dans mon iPad.

J'ai écrit le code suivant, mais il faut environ 20 minutes, est-il un moyen plus rapide?

- (NSArray *)insertPriceSQLWithPrice:(Price *) price
{

SQLiteManager *dbInfo = [SQLiteManager sharedSQLiteManagerWithDataBaseName:@"codefuel_catalogo.sqlite"];


sqlite3 *database;

NSString *querySQL=[self formatStringQueryInsertWithTable:@"prices_list" andObject:price];


if(sqlite3_open([dbInfo.dataBasePath UTF8String], &database) == SQLITE_OK)
{
    sqlite3_stmt * compiledStatement;


    const char *query_stmt = [querySQL UTF8String];

    int result = sqlite3_prepare_v2(database, query_stmt, -1, &compiledStatement, NULL);

    if (result == SQLITE_OK)
    {
        int success = sqlite3_step(compiledStatement);

        NSLog(@"el numero de success es -> %i",success);
        if (success == SQLITE_ERROR)
            NSLog(@"Error al insertar en la base de datps");

    }
    else
        NSLog(@"Error %@ ERROR!!!!",querySQL);

    sqlite3_finalize(compiledStatement);
}

sqlite3_close(database);
return nil;
}
Je prendrais l'ouverture et la fermeture de la base de données de la méthode. C'est vous coûter une quantité considérable de temps. Créer et conserver le connectoin à travers chacun des 40 000 insère ensuite le détruire une fois terminé. Aussi, le NSLogs peut être ralentissement de l'exécution réelle. J'avais essayer de l'exécuter sans les logs pour voir combien de temps cela prend.
Ne vous rouvrez la base de données de 40000 fois? (Vous devriez aussi éviter de recompilation de la déclaration une fois par enregistrement, et il est mieux de le faire tous les insère dans une transaction unique, mais c'est moins important que la réouverture pour chaque ligne).
Vous pouvez insérer plusieurs lignes par insertion avec le droit de requête, et envelopper l'ensemble du processus de transaction au moment de SQLite a à vider sur le disque après chaque insertion qui va ralentir vous à droite vers le bas. Vous pouvez également réutiliser la déclaration préparée à l'avance, juste de reliaison les valeurs modifiées à chaque fois
Ouvrir la DB et de la laisser ouverte, démarrer une transaction, la préparation de la déclaration qu'une seule fois.

OriginalL'auteur OscarVGG | 2013-01-31