74 votes

Un moyen de pré-peupler les données de base?

J'ai créé une application de liste et l'ai sauvegardée avec des données de base.

J'aimerais avoir une liste par défaut d'éléments de 10 aéroports, par exemple, pour que l'utilisateur ne soit pas obligé de partir de zéro.

Y a-t-il un moyen de faire ça?

Toute aide est appréciée. Merci d'avance.

61voto

Ken Aspeslagh Points 8363

Voici la meilleure façon (et ne nécessite pas de connaissances SQL):
Créer rapidement une Base de Données de l'application iPhone (Ou même le Mac app) en utilisant le même modèle d'objet de votre Liste d'application. Écrire quelques lignes de code pour enregistrer la valeur par défaut pour les objets gérés que vous voulez dans le magasin. Ensuite, exécutez l'application dans le simulateur. Maintenant, allez dans ~/Bibliothèque/Application Support/Simulateur d'iPhone/Utilisateur/Applications. Trouvez votre demande parmi les Guid, puis il suffit de copier le sqlite store dans votre Liste d'application du dossier de projet.

Ensuite, chargez ce magasin, comme ils le font dans le CoreDataBooks exemple.

31voto

Oscar Gomez Points 12966

Oui, l’exemple de CoreDataBooks le fait, vous pouvez télécharger le code ici: exemple de code

Fondamentalement, créez simplement votre propre base de données sqlite et ajoutez-la aux ressources, puis, au lancement de l'application, chargez-la comme ceci (copié à partir de l'exemple de code)

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator != nil) {
    return persistentStoreCoordinator;
}


NSString *storePath = [[self applicationDocumentsDirectory]      stringByAppendingPathComponent: @"CoreDataBooks.sqlite"];
 /*
  Set up the store.
 For the sake of illustration, provide a pre-populated default store.
 */
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn't exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
  NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"CoreDataBooks"      ofType:@"sqlite"];
 if (defaultStorePath) {
 [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
 }
}

NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

 NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber   numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 
  persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

 NSError *error;
 if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
  // Update to handle the error appropriately.
  NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
 exit(-1);  // Fail
}    

return persistentStoreCoordinator;
}
 

J'espère que cela pourra aider.

-Oscar

11voto

rednaw Points 3856

Avec cette méthode, vous n'avez pas besoin de faire une application à part, ou avez des connaissances SQL. Vous avez seulement besoin d'être en mesure de faire un fichier JSON pour votre initiale des données.

J'utilise un fichier JSON que je lis dans les objets, puis de les insérer dans la Base de Données. Je le fais quand l'application initialise. J'ai également une autre entité dans ma base de données qui indique si ces données initiales est déjà inséré, après que je l'insérer les données initiales-je définir cette entité de sorte que la prochaine fois que le script s'exécute, il voit que les données initiales a déjà été initialisé.

À lire fichier json à des objets:

NSString *initialDataFile = [[NSBundle mainBundle] pathForResource:@"InitialData" ofType:@"json"];
NSError *readJsonError = nil;
NSArray *initialData = [NSJSONSerialization
                        JSONObjectWithData:[NSData dataWithContentsOfFile:initialDataFile]
                        options:kNilOptions
                        error:&readJsonError];

if(!initialData) {
    NSLog(@"Could not read JSON file: %@", readJsonError);
    abort();
}

Ensuite, vous pouvez faire des objets de l'entité pour elle comme ceci:

[initialData enumerateObjectsUsingBlock:^(id objData, NSUInteger idx, BOOL *stop) {

    MyEntityObject *obj = [NSEntityDescription
                          insertNewObjectForEntityForName:@"MyEntity"
                          inManagedObjectContext:dataController.managedObjectContext];

    obj.name = [objData objectForKey:@"name"];
    obj.description = [objData objectForKey:@"description"];

    // then insert 'obj' into Core Data

}];

Si vous voulez une description plus détaillée sur la façon de le faire, consultez ce tutoriel: http://www.raywenderlich.com/12170/core-data-tutorial-how-to-preloadimport-existing-data-updated

10voto

Massimo Cafaro Points 18759

Pour 10 éléments, vous pouvez simplement le faire dans les applicationDidFinishLaunching: de votre délégué d’application.

Définissez une méthode, par exemple insertPredefinedObjects , qui crée et remplit les instances de l'entité en charge de la gestion de vos éléments aéroport, et enregistrez votre contexte. Vous pouvez soit lire les attributs d’un fichier, soit simplement les connecter à votre code. Ensuite, appelez cette méthode dans applicationDidFinishLaunching: .

6voto

Adrian Bigland Points 521

Gardez à l'esprit, quand à la suite de la CoreDataBooks un exemple de code, sans doute qu'il rompt le iOS de Stockage de Données des lignes Directrices:

https://developer.apple.com/icloud/documentation/data-storage/

J'ai eu une application rejeté pour la copie de la (lecture seule) de pré-base de données de population pour le répertoire documents - comme elle obtient ensuite sauvegardées sur iCloud, et qu'Apple ne voulez que cela se produise à l'utilisateur des fichiers générés.

Les lignes directrices ci-dessus vous apporter des solutions, mais pour la plupart ils se résument à:

  • stocker les données dans les caches répertoire, et de traiter les situations où le système d'exploitation de purge des caches - vous devez reconstruire la base de données, ce qui a probablement des règles pour la plupart d'entre nous.

  • définir un "ne pas mettre en cache attribut" sur le fichier de base de données, ce qui est un peu obscur, comme il doit être fait différemment pour les différentes versions de système d'exploitation.

Je ne pense pas que c'est trop difficile, mais être conscient que vous avez un peu supplémentaire à faire pour que un exemple de code de travail aux côtés d'iCloud...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X