6
votes

Problèmes de migration de Coredata

J'écris actuellement la version suivante d'une application.

Dans l'ancienne version, il n'y avait pas de coredata sqlite p>

dans la nouvelle version, nous avons une base de données locale CoreData SQLite. P >

Lorsque j'installe la nouvelle version de l'application à partir de zéro, il n'y a aucun problème, le magasin est là et je peux interroger. P>

Cependant, lorsque j'installe l'application sur téléphone qui a la précédente Version sur elle, mes requêtes reviennent sans résultats. P>

Lorsque je regarde les journaux, il n'y a rien dans la console et aucune erreur n'est renvoyée. P>

   #import "CoreDataHelper.h"

@implementation CoreDataHelper
@synthesize store = _store;
@synthesize coordinator = _coordinator;


#pragma mark - 
#pragma mark - FILES
NSString *storeFileName = @"Reporting.sqlite";

#pragma mark - 
#pragma mark - PATHS
- (NSString *)applicationDocumentsDirectory {

    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];

}

- (NSURL *)applicationStoresDirectory {

    NSURL *storesDirectory = [[NSURL fileURLWithPath:[self applicationDocumentsDirectory]]URLByAppendingPathComponent:@"Stores"];

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if (![fileManager fileExistsAtPath:[storesDirectory path]]) {
        NSError *error = nil;
        if ([fileManager createDirectoryAtURL:storesDirectory
                   withIntermediateDirectories:YES
                                    attributes:nil
                                         error:&error]) {
            //File created
        } else {

            //Error
        }
    }

    return storesDirectory;

}

- (NSURL *)storeURL {

    return [[self applicationStoresDirectory] URLByAppendingPathComponent:storeFileName];

}

#pragma mark - 
#pragma mark - SETUP
- (id)init {

    if (self = [super init]) {
        _model = [NSManagedObjectModel mergedModelFromBundles:nil];
        _coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:_model];
        _context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
        [_context setPersistentStoreCoordinator:_coordinator];
    }

    return self;
}

- (void)loadStore {

    if (_store) return; // Don't load store if it is already loaded

    // to generate the database in the app launching comment next lines...

    if(![self getFileExistence:storeFileName]){
        // file URL in our bundle
        NSURL *fileFromBundle = [[NSBundle mainBundle]URLForResource:@"FaultReporting" withExtension:@"sqlite"];

        // Destination URL
        NSURL *destinationURL = [[self applicationStoresDirectory] URLByAppendingPathComponent:@"FaultReporting.sqlite"];

        // copy it over
        [[NSFileManager defaultManager]copyItemAtURL:fileFromBundle toURL:destinationURL error:nil];
    }

    // end of comments

    NSError *error = nil;

    @try {
        _store = [_coordinator addPersistentStoreWithType:NSSQLiteStoreType
                                            configuration:nil
                                                      URL:[self storeURL]
                                                  options:@{                                                         NSMigratePersistentStoresAutomaticallyOption: @(YES),
                                                            NSInferMappingModelAutomaticallyOption: @(YES)}
                                                    error:&error];
    }
    @catch (NSException *exception) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[NSString stringWithFormat:@"Error: %@, %@",error, [error userInfo]] delegate:self
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil, nil];
        [alert show];
    }
    @finally {
        //
    }

}


2 commentaires

Quels appels loadstore ? Que peut modifier la variable d'instance _store ? Est loadstore dépasser la première ligne, if (_store) ?


Vous avez quelques endroits où vous passez un paramètre & error sur une méthode et ne vérifiez pas pour voir si une erreur est survenue et une autre avec erreur : nil . Vous devriez commencer par vérifier au moins que le code ci-dessus fait ce que vous attendez, et en cherchant à voir quels messages d'erreur, le cas échéant, les API essaient de vous envoyer.


3 Réponses :


2
votes

su. Je ne sais pas si vous l'avez fait, mais essayez le suivi:

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                             [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                             [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
[[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
    NSError* error;
    [managedObjectContext.persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                                                                  configuration:nil
                                                                            URL:self.storeUrl
                                                                        options:options // this is required to migrate some core data model attributes
                                                                          error:&error];


1 commentaires

Je fais déjà (en passant directement les arguments dans les options) essayé votre chemin, n'a pas fonctionné, merci pour la suggestion



1
votes

Je ne suis pas sûr que cela s'applique à vous ou non, mais j'avais une situation similaire lors de la mise à niveau de iOS 7 à iOS 8. Dans iOS 8 NsmanagedObject Ajout d'une propriété pour supprimé . J'ai eu une propriété appelée supprimé sur mes modèles d'objet gérés. J'ai dû changer le nom de ma colonne supprimée à quelque chose qui n'a pas eu de conflit avec la nouvelle propriété supprimée sur nsmanagedObject .


2 commentaires

La méthode Isdeletted était toujours là. Dans le cadre du refacteur Swift pour iOS 8, c'était redéclamé comme une propriété.


Merci pour la clarification!



1
votes

Pourriez-vous confirmer que vous avez exécuté toutes ces étapes?

Étape 1: Ajouter le framework H2>

Cliquez sur la cible de votre application (dans le volet de gauche, c'est l'icône supérieure avec le nom de votre app) puis accédez à l'onglet "Build Phases" puis sur "Link binaire avec des bibliothèques", cliquez sur le Little '+' en bas, puis trouvez 'coredata.framework' et ajoutez-le à votre projet P>

alors Soit importer Coredata sur tous les objets qui en ont besoin: p> xxx pré>

ou ajoutez l'importation ci-dessous dans les importations communes dans votre fichier .pch: p> xxx Pré>


Étape 2: ajoutez le modèle de données h2>

pour ajouter le fichier .xcdatamodel clic droit / cliquez sur vos fichiers dans le volet de droite (comme dans un dossier de ressources pour une conservation de sécurité ) Et sélectionnez Pour ajouter un nouveau fichier, cliquez sur l'onglet Données de base lors de la sélection de votre type de fichier, puis cliquez sur "Modèle de données", donnez-lui un nom et cliquez sur Suivant et Terminez et il l'ajoutera à votre projet. Lorsque vous cliquez sur cet objet de modèle, vous verrez l'interface pour ajouter les entités à votre projet avec toutes les relations que vous souhaitez. P>

Étape 3: Mettre à jour l'application Délégée H2>

Ajouter ces Objets à AppDelegate.h p>

@synthesize fetchedResultsController, managedObjectContext;


0 commentaires