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 { // } }
3 Réponses :
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];
Je fais déjà (en passant directement les arguments dans les options) essayé votre chemin, n'a pas fonctionné, merci pour la suggestion
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 code> Ajout d'une propriété pour
supprimé code>. J'ai eu une propriété appelée
supprimé code> 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 code>. P>
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!
Pourriez-vous confirmer que vous avez exécuté toutes ces étapes?
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> ou ajoutez l'importation ci-dessous dans les importations communes dans votre fichier .pch: p> 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> Ajouter ces Objets à AppDelegate.h p>
Étape 2: ajoutez le modèle de données h2>
Étape 3: Mettre à jour l'application Délégée H2>
@synthesize fetchedResultsController, managedObjectContext;
Quels appels
loadstore code>? Que peut modifier la variable d'instance
_store code>? Est
loadstore code> dépasser la première ligne,
if (_store) code>?
Vous avez quelques endroits où vous passez un paramètre
& error code> sur une méthode et ne vérifiez pas pour voir si une erreur est survenue et une autre avec erreur
: nil code>. 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.