2012-08-23 4 views
0

Je l'ai fait un peu de recherche pour d'autres personnes ayant des problèmes similaires, les solutions prévues les ont pas réussi à résoudre mon problème, donc je pense que ses quelque chose évidente qui manque ou je vérifie quelque chose de façon incorrecte et inappropriée en essayant d'identifier mon erreur.iOS: données plist pas de fichiers persistants/difficulté à trouver

Mon problème est qu'un fichier .plist que j'ai ajouté afin d'avoir le stockage de données persistantes pour mon application n'est pas trouvé lorsque je tente de sauver programatically/charge de celui-ci.

J'ai:

  • vérifié qu'il est répertorié sous la rubrique « Ressources Bundle Copier » dans l'onglet Construire des phases de mon projet.
  • vérifié que le fichier est copié dans mon/Utilisateurs/Me/Bibliothèque/Application Support/iPhone Simulator/5.1/Applications/App unique dossier ID/de myapp.app, et si supprimé et recourue il apparaît une nouvelle fois.
  • nettoyer et reconstruit mon projet

Mon code est organisé de telle sorte que le chargement et l'enregistrement ont lieu dans deux endroits différents. La charge se produit lorsqu'une vue modale est affichée et que l'utilisateur peut sélectionner différents ensembles de données. L'enregistrement s'effectue dans la fonction de délégation d'application - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions. J'ai vérifié que ces deux fonctions sont appelées, bien que le comportement me soit totalement perplexe.

Code assez boilerplate sauvegarder et charger fortement en fonction de l'article de ressources pour les développeurs plist:

- (void)applicationDidEnterBackground:(UIApplication *)application 
{  
    NSDictionary *someDataToSave = [NSDictionary dictionaryWithObject:self.viewController.dataStorage forKey:@"myData"]; 

    NSString *error; 
    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
    NSString *plistPath = [rootPath stringByAppendingPathComponent:@"someData.plist"]; 
    plistPath = [rootPath stringByAppendingPathComponent:@"someData.plist"]; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) { 
     plistPath = [[NSBundle mainBundle] pathForResource:@"someData.plist" ofType:@"plist"]; 
    } 

    NSString *generatedName = [NSString stringWithFormat:@"DataSet - %s", [NSDate date]]; 

    NSDictionary *plistDict = [NSDictionary dictionaryWithObject:someDataToSave forKey:generatedName]; 
    NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:plistDict format:NSPropertyListXMLFormat_v1_0 errorDescription:&error]; 

    if(plistData) 
     [plistData writeToFile:plistPath atomically:YES]; 
    else { 
     NSLog(error); 
    } 
} 

-(void)loadRecordsFromPList 
{ 

    NSString *errorDesc = nil; 
    NSPropertyListFormat format; 
    NSString *plistPath; 
    NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 

    plistPath = [rootPath stringByAppendingPathComponent:@"someData.plist"]; 
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath]) { 
     plistPath = [[NSBundle mainBundle] pathForResource:@"someData.plist" ofType:@"plist"]; 
    } 

    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath]; 
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc]; 

    if (!temp) { 
     NSLog(@"Error reading plist: %@, format: %d", errorDesc, format); 
    } 

    self.myRecordsList = [NSMutableDictionary dictionaryWithDictionary:temp];  
} 

J'ai passé des heures dans le débogueur d'essayer différentes choses et rien que je l'ai retouché m'a fait nulle part. fileExistsAtPath renvoie systématiquement null sans raison apparente, et le fichier n'est pas trouvé malgré que je l'ai vu dans le dossier. En outre, j'ai créé une seule application de vue contenant rien de plus qu'un fichier plist, et un contrôleur de vue dans lequel j'utilise 99% du même code que ci-dessus, et cela fonctionne sans problème.

Toute aide que tout le monde peut donner serait très apprécié. À ce stade, j'ai essayé tout ce que je peux penser et puis certains.

Répondre

0

Dans applicationDidEnterBackground, vous définissez plistPath sur le chemin à l'intérieur du groupe principal s'il n'y a pas de fichier plist dans le répertoire Documents Et puis vous utiliser le même chemin pour l'écriture du fichier plist. En d'autres termes, vous essayez d'écrire le dictionnaire dans le fichier plist dans le bundle principal des applications.

Seulement en loadRecordsFromPList il est logique de regarder les documents dossier d'abord, puis dans le faisceau principal. Lorsque vous enregistrez les données, vous devez toujours enregistrer dans le dossier Documents.

+0

D'accord qui fait sens, maintenant que je regarde en arrière, je ne suis pas sûr que cela a là-dedans, il ne croit pas son dans l'exemple fourni sur le site Dev Apple. Le problème que j'exécute maintenant est que lorsque je tente de sérialiser l'objet dictionnaire, dataFromPropertyList: format: errorDescription: renvoie zéro. Le dictionnaire que je lui passe est valide et non nul. Une idée de pourquoi cela pourrait arriver? –

+0

Il y a encore une erreur dans votre code: Quand vous créez 'generatedName' vous utilisez"% s "comme format, mais cela devrait être"% @ ". - Quelle est la valeur de 'error' après que' dataFromPropertyList: ... 'a échoué? Se pourrait-il que votre dictionnaire contienne des objets autres que NSData, NSString, NSNumber, NSDate, NSArray ou NSDictionary? –

+0

Ah bon attraper sur celui-là, je me demandais pourquoi cette clé était brouillée mais l'avait écrite comme provoquée par n'importe quelle erreur provoquant l'initialisation de mon NSData à zéro. L'erreur est "Liste de propriétés invalide pour le format (les listes de propriétés ne peuvent pas contenir d'objets de type 'CFType')". Je suppose que cela pourrait venir du fait que je raconte des tableaux de points qui sont NSValues? Je suppose que je vais devoir chercher une autre façon de le faire. –

Questions connexes