iOS CoreData – prepopulate db avec des index existants

Je construis un projet où j'ai besoin de préremplir une database coredata avec des données existantes.

J'ai construit un parsingur pour créer le file sqlite dans le simulateur iOS, tout fonctionne bien. J'utilise une seule entité, et l'un des attributes est indexé. La performance après l'parsing de mon file de données dans datatables de base est excellente, tout va bien.

Maintenant j'utilise le file sqlite généré (~ 200Mb) dans le projet avec le même model de données, le même index, etc … et au premier démarrage je copy sur le file db pour préremplir datatables

NSSsortingng *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"myproject" ofType:@"sqlite"]; NSSsortingng *storePath = [[[self applicationDocumentsDirectory] path] ssortingngByAppendingPathComponent: @"myproject.sqlite"]; NSError *error; if (![[NSFileManager defaultManager] fileExistsAtPath:storePath]) { if ([[NSFileManager defaultManager] copyItemAtPath:defaultStorePath toPath:storePath error:&error]) NSLog(@"Copied starting data to %@", storePath); else NSLog(@"Error copying default DB to %@ (%@)", storePath, error); } 

La copy fonctionne correctement et datatables peuvent être consultées normalement. Cependant, la performance est terrible et l'indice n'est clairement pas utilisé.
Un coup d'oeil à la taille du file sqlite après l'opération de copy, il est passé de 200 Mo à 120 Mo.
Tout semble bien dans le model, ce qui doit être indexé est vérifié comme indexé.

1) Est-il possible de supprimer datatables d'index lors de la copy de sqlite?
2) Est-il possible de rebuild par programme l'index?
3) D'autres pensées?

Consultez la documentation Apple sur ce problème :

Bien que Core Data prenne en charge SQLite comme l'un de ses types de stockage persistant, le format de la database est privé. Vous ne pouvez pas créer une database SQLite à l'aide de l'API SQLite native et l'utiliser directement avec Core Data (vous ne devez pas non plus manipuler un magasin Core Data SQLite existant à l'aide de l'API SQLite native). Si vous avez une database SQLite existante, vous devez l'importer dans un magasin de données Core (voir " Importation efficace de données ").

Pour résumer, ne le faites pas . Le schéma de database est privé et peut changer.

J'utilise des files CSV pour pré-charger toutes mes données initiales sur CoreData en arrière-plan lorsque l'application démarre pour la première fois. Méfiez-vous de l'access multithread CoreData, d'ailleurs.

J'espère que cela aide.

On dirait que le problème était que le projet n'était pas bien nettoyé entre les tests, ça aurait pu être un bug dans Xcode 4.3 que j'utilisais à l'époque.

La même méthodologie fonctionne bien maintenant.