9
votes

Comment ajouter des données de base à une application utilitaire existante

J'ai créé une application utilitaire presque complète, mais maintenant je suis sur un point, j'ai vraiment besoin de persister les données.

Étant donné que Xcode fournit uniquement des modèles de données de base dans une application de navigation ou de fenêtre, est-il un moyen facile d'ajouter des données de base à mon application? Je n'ai jamais travaillé avec des données de base et il suffit de persister les messages avec 460 caractères et un nom de contact TP IT comme antécédents d'envoi de messages.

ou devrais-je commencer par une nouvelle application basée sur la fenêtre incl. Données de base et essayer de construire la partie utilitaire / retournement à la main?

Quelqu'un peut-il me suggérer la meilleure pratique pour ma situation?


0 commentaires

3 Réponses :


8
votes

Vous devrez ajouter le cadre de Coredata à votre cible, créer un modèle de données et instancier le nsmanagedObjectmodel , nspersistenttorecoordinator et nsmanagedObjectContext Objets.

Ajout de données de base à une application existante est discutée brièvement dans Ce document Apple (recherche pour "application existante")

Vous devez également voir Apple Tutoriel pour avoir une idée de ce qui est impliqué.

Vous pouvez toujours envisager d'utiliser également SQLite.


6 commentaires

Je suis d'accord avec l'idée d'utiliser SQLite à la place. Les données de base sont assez robustes et car elles sonnent comme il n'ya pas beaucoup de données ni de relations complexes persistantes ici, SQLite pourrait être le moyen moins complexe et plus efficace de le faire.


Les données de base sont plus faciles cependant, une fois que vous comprenez comment cela fonctionne - cela est particulièrement vrai pour les petits projets.


Je voterais contre le rouleau de votre propre code directement contre SQLite. Tout ce que ce code que j'ai jamais vu n'a jamais été rétabli des parties de données de base, mais d'une buggy et d'une manière encore moins préférable. Les données de base sont la voie, en particulier lorsque des fixations sont ajoutées à la touche de cacao sur la route.


J'échonne ce qui a dit Peylow concernant le rouleau de votre propre code. Si vous choisissez SQLite, lisez ceci: Stackoverflow .com / questions / 874830 / ...


Dois-je créer et ajouter manuellement une base de données SQLite et l'ajouter ainsi que les étapes ci-dessus? ou les données de base vont-elles la créer lui-même?


Coredata s'intègre également parfaitement à iCloud maintenant.



5
votes

Créer un nouveau projet en Xcode, à l'aide des modèles fournis - trouvez-en un qui dispose d'une boîte à vérifier pour utiliser les données de base pour le stockage.

Cela vous donne un fichier XCDatamodel et certaines variables de code / de classe dans le délégué de l'application que vous pouvez copier de ce projet dans votre actuel.

Je recommande également fortement le didacticiel pomme mentionné par Nall.

Si vous décidez de simplement utiliser SQLLITE directement à la place, envisagez vivement d'utiliser FMDB , qui simplifie le code SQL. C'est un fichier que vous ajoutez à un projet.


1 commentaires

Je recommande vivement FMDB si vous allez utiliser SQLite.



18
votes

Alors que j'essaie également de comprendre le TwighlightZone des données de base, j'ai également compris les étapes suivantes pour migrer un projet «normal» aux données de base (en comparant un projet d'application vide avec un projet d'application vide avec des données de base)

Étape 1 Strong>: Ajouter Coredata.framework P>

A) STRUT> dans "Résumé de la cible de projet" sous "Cadres et bibliothèques liés" Ajouter la Coredata. framework avec le bouton +
b) strong> Sélectionnez Fichier / Nouveau / Fichier et dans la section "Données de base" Ajoutez un nouveau "modèle de données" (et appelez-le i.e. xxxxxxx (pour la nommée voir 3.B)
c) strong> dans le fichier Applikation-Prefix.Pch (où l'application est votre nom de projet) Ajouter le P>

- (void)saveContext
{
    NSError *error = nil;
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil)
    {
        if ([managedObjectContext hasChanges] & ![managedObjectContext save:&error])
        {
            /*
             Replace this implementation with code to handle the error appropriately.

             abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 
             */
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        } 
    }
}

#pragma mark - Core Data stack

/**
 Returns the managed object context for the application.
 If the context doesn't already exist, it is created and bound to the persistent store coordinator for the application.
 */
- (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil)
    {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created from the application's model.
 */
- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"XXXXXXX" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return __managedObjectModel;
}

/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"XXXXXXX.sqlite"];

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error])
    {
        /*
         Replace this implementation with code to handle the error appropriately.

         abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development. 

         Typical reasons for an error here include:
         * The persistent store is not accessible;
         * The schema for the persistent store is incompatible with current managed object model.
         Check the error message to determine what the actual problem was.


         If the persistent store is not accessible, there is typically something wrong with the file path. Often, a file URL is pointing into the application's resources directory instead of a writeable directory.

         If you encounter schema incompatibility errors during development, you can reduce their frequency by:
         * Simply deleting the existing store:
         [[NSFileManager defaultManager] removeItemAtURL:storeURL error:nil]

         * Performing automatic lightweight migration by passing the following dictionary as the options parameter: 
         [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

         Lightweight migration will only work for a limited set of schema changes; consult "Core Data Model Versioning and Data Migration Programming Guide" for details.

         */
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return __persistentStoreCoordinator;
}

#pragma mark - Application's Documents directory

/**
 Returns the URL to the application's Documents directory.
 */
- (NSURL *)applicationDocumentsDirectory
{
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}


2 commentaires

Ensuite, comment gérer le contexte serait au courant du modèle? automatiquement?


@ Jun1st: Renommer le SQLite et les fichiers MOMD à la même manière que le XCDatamodel est la manière dont cet exemple relie le contexte du modèle