telecharger - mise a jour ios 12




Un moyen de pré-remplir les données de base? (6)

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

Je voudrais avoir une liste par défaut des articles de say 10 airport, de sorte que l'utilisateur n'a pas à partir de zéro.

Est-ce qu'il y a un moyen de faire ça?

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


Cette réponse est seulement pour les personnes qui sont

  • y compris une base de données pré-remplie dans votre application
  • faire une application pour plusieurs plates-formes (iOS, Android, etc.)

J'avais fait une base de données SQLite prépopulée pour une application Android. Puis, quand j'ai fait une version iOS de l'application, j'ai pensé qu'il serait préférable d'utiliser Core Data. J'ai donc passé pas mal de temps à apprendre les données de base, puis à réécrire le code pour préremplir la base de données. Apprendre à faire chaque étape dans les deux plates-formes a nécessité beaucoup de recherche et d'essais et d'erreurs. Il y avait beaucoup moins de chevauchement que j'aurais espéré.

Au final, j'ai juste décidé d'utiliser la même base de données SQLite de mon projet Android. Ensuite, j'ai utilisé le wrapper FMDB pour accéder directement à la base de données dans iOS. Les avantages:

  • Seulement besoin de faire la base de données pré-remplie une fois.
  • Ne nécessite pas de changement de paradigme. La syntaxe entre Android et FMDB, bien que différente, est encore assez similaire.
  • Avoir beaucoup plus de contrôle sur la façon dont les requêtes sont effectuées.
  • Permet la recherche en texte intégral.

Bien que je ne regrette pas d'apprendre Core Data, si je devais le faire, j'aurais pu gagner beaucoup de temps en me contentant de SQLite.

Si vous démarrez dans iOS et que vous envisagez de passer à Android, j'utiliserais toujours un wrapper SQLite comme FMDB ou un autre logiciel pour préremplir la base de données. Bien que vous puissiez extraire techniquement la base de données SQLite que vous avez préchargée avec Core Data, le schéma (noms de tables et de colonnes, etc.) sera étrangement nommé.

Soit dit en passant, si vous n'avez pas besoin de modifier votre base de données préremplie, ne le copiez pas dans le répertoire des documents après l'installation de l'application. Il suffit d'y accéder directement depuis le bundle.

// get url reference to databaseName.sqlite in the bundle
let databaseURL: NSURL = NSBundle.mainBundle().URLForResource("databaseName", withExtension: "sqlite")!

// convert the url to a path so that FMDB can use it
let database = FMDatabase(path: databaseURL.path)

Cela fait en sorte que vous n'avez pas deux copies.

Mettre à jour

J'utilise maintenant SQLite.swift plutôt que FMDB, car il s'intègre mieux avec les projets Swift.


Gardez à l'esprit, en suivant l'exemple de code de CoreDataBooks, qu'il enfreint probablement les consignes de stockage de données iOS:

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

Une application a été rejetée pour avoir copié la base de données pré-remplie (en lecture seule) dans le répertoire des documents - car elle est ensuite sauvegardée sur iCloud - et Apple souhaite uniquement que cela se produise dans les fichiers générés par les utilisateurs.

Les lignes directrices ci-dessus offrent quelques solutions, mais elles se résument principalement à:

  • stockez la base de données dans le répertoire caches, et gérez avec élégance les situations où le système d'exploitation purge les caches - vous devrez reconstruire la base de données, ce qui probablement l'exclut pour la plupart d'entre nous.

  • définir un 'ne pas mettre en cache l'attribut' sur le fichier DB, ce qui est un peu obscur, car il doit être fait différemment pour les différentes versions du système d'exploitation.

Je ne pense pas que ce soit trop compliqué, mais sachez que vous avez un peu plus à faire pour que cet exemple de code fonctionne avec iCloud ...


Oui, il existe en effet l'exemple CoreDataBooks, vous pouvez télécharger le code ici: exemple de code

Qu'est-ce que vous faites est de créer le magasin interne (base de données) en utilisant la procédure normale pour initialiser votre magasin comme vous le feriez avec n'importe quel autre magasin, puis exécutez le code comme décrit dans l'exemple CoreDataBooks (extrait de code ci-dessous ). Une fois le magasin initialisé, vous devez créer un NSManagedObjectContext et l'initialiser avec le magasin persistant créé, insérer toutes les entités dont vous avez besoin et enregistrer le contexte.

Une fois le contexte sauvegardé avec succès, vous pouvez arrêter votre application, puis allez dans finder et allez dans le dossier: ~/Library/Developer type dans la recherche .sqlite et regardez / Developer, le tri par date vous donnera le plus récent. base de données sqlite qui doit correspondre à l'heure à laquelle le code a été exécuté, vous pouvez ensuite prendre ce magasin et l'ajouter en tant que ressource de votre projet. Ce fichier peut ensuite être lu par un coordinateur de magasin persistant.

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

if (persistentStoreCoordinator) {
    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


Pour 10 éléments, vous pouvez simplement le faire dans applicationDidFinishLaunching: dans le délégué de votre 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 articles aéroportuaires, et sauvegarde votre contexte. Vous pouvez soit lire les attributs d'un fichier ou simplement les connecter dans votre code. Ensuite, appelez cette méthode dans applicationDidFinishLaunching:


Une autre méthode pour stocker les valeurs par défaut est trouvée via NSUserDefaults. (surprise!) Et c'est facile.

Suggéré par certains, mettez cela dans l' applicationDidFinishLaunching

Dans le cas de 10 défauts, Airport0 à 9

Réglage

NSUserDefaults *nud = [NSUserDefaults standardUserDefaults];
[nud setString:@"MACADDRESSORWHY" forKey:@"Airport0"];
    ...
[nud setString:@"MACADDRESSORWHY" forKey:@"Airport9"];
[nud synchronize];

ou

[[NSUserDefaults standardUserDefaults] setString:@"MACADDRESSORWHY" forKey:@"Airport9"]];
     ...
[[NSUserDefaults standardUserDefaults] synchronize];

Et puis, obtenir les valeurs par défaut.

NSString *air0 = [[NSUserDefaults standardUserDefaults] stringForKey:@"Airport0"];

Voici le meilleur moyen (et ne nécessite pas de connaissances SQL):
Créez une application iPhone Core Core rapide (ou même une application Mac) en utilisant le même modèle d'objet que votre application List. Écrivez quelques lignes de code pour enregistrer les objets gérés par défaut que vous voulez stocker dans le magasin. Ensuite, exécutez cette application dans le simulateur. Maintenant, allez dans ~ / Bibliothèque / Application Support / iPhone Simulator / Utilisateur / Applications. Trouvez votre application parmi les GUID, puis copiez simplement le magasin sqlite dans le dossier de votre application List.

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





persist