56 votes

Première Application de mise à Jour, les Données de l'Utilisateur est Perdu (qui était stocké dans le répertoire Documents de l')

Ma première application mise à jour est juste allé vivre la nuit dernière et j'ai reçu une plainte que la mise à jour a causé les données créés par l'utilisateur (en partie) à disparaître. J'ai été en mesure de reproduire le problème, mais ne peut pas dire pourquoi.

Dans le répertoire Documents, j'ai enregistré un fichier de clé qui me dit que le "titre" de tous les fichiers de l'utilisateur et leurs noms de fichiers (chemin complet). Ensuite, tous les fichiers de l'utilisateur sont également dans le répertoire Documents.

Lorsque la mise à jour se produit, le fichier de clé est toujours là (au moins, je pense que c'est parce que les données s'affiche dans le premier écran de l'app - applications pleinement de quitter et de relancer après la mise à jour, non?), mais, lorsque l'utilisateur essaie de naviguer dans les fichiers, il n'y a pas de données et de toutes les nouvelles données saisies par l'utilisateur dans n'est jamais enregistré.

Il agit exactement comme il l'a fait dans le débogage lorsque j'ai été accidentellement à l'aide d'un nom de fichier non valide (avec une mauvaise caractères) - il n'a jamais sauvé. Mais avec la mise à jour, ces fichiers ont été enregistrés correctement dans l'ancienne version, mais sont en quelque sorte échoué dans la nouvelle version.

C'est ma première application et mon premier jour et je suis tout à fait à une perte ici. J'ai tiré de l'application de la vente pour le moment (il ne savait pas que tu ne pouvais pas tout simplement revenir à une ancienne version! oups!) et apprécierait vivement toutes les idées quant à l'endroit où/comment faire pour trouver le problème et comment écrire une BONNE mise à jour qui ne perdrez pas les données. (Jusqu'ici, tout ce que j'ai trouvé est "enregistrer les données dans le répertoire Documents", qui est ce que je faisais déjà.)

J'ai de l'application d'origine enregistré dans son propre projet et je peux revenir et de travailler à partir de cette à nouveau. J'ai copié l'ensemble de répertoire lorsque j'ai commencé à travailler sur la mise à jour et je me demande si cela pourrait en quelque sorte être le problème? J'ai fait changer le nom du répertoire qui contient tous les XCode fichiers et utilisé le Projet>fonction Renommer. Que cela pourrait avoir cet effet en quelque sorte?

L'application (à la fois originale et mise à jour) est en cours d'exécution sur 4.2 et au-dessus, si ce qui compte.

RÉSOLUTION:

Je crois que j'ai compris ce problème. Comme je l'ai dit au début de ma question, j'essayais de sauver le CHEMIN d'accès COMPLET de l'utilisateur des fichiers de ma clé de fichiers. Apparemment, le chemin d'accès complet n'est PAS garanti d'être le même après une mise à jour (je suis sûr que c'est documenté quelque part, mais je n'avais pas courir à travers elle).

Ainsi, les fichiers de l'utilisateur A été transporté à la mise à jour du nouveau répertoire Documents, mais j'ai été à la recherche pour eux sur le vieux chemin d'accès absolu, c'est à dire pas dans mon bac à sable.

Fixe en mettant une boucle en application de l'didFinishLaunching de sortir de la délinquance fichier de filepaths (QUE j'avais toujours cherché localement et il était encore de travail) et les couper vers le bas, juste les noms de fichiers. Le chemin d'accès de Documents doit être trouvé et ajouté par programme fichier à chaque fois que les opérations sont effectuées.

Pour ce que ça vaut, c'était vraiment bon pour moi qu'il n'y a aucun moyen de revenir à une ancienne binaire dans le magasin parce que la ré-installation de la version d'origine n'aurait pas fixe de l'utilisateur problème, mais j'aurais cru qu'il avait, au moins initialement. Je ne souhaite qu'il y avait un moyen d'avoir rejeté les MISES à jour, mais toujours permis à de nouveaux achats (puisque le problème n'a pas d'incidence sur les nouveaux achats). Probablement pas assez communs situation le justifie, si.

59voto

Andrew Points 2000

Juste pour faire la lumière sur cette internet pour passer des autres. Oui, l'OP a répondu à sa propre question à la fin. Vous ne devriez jamais stocker les Url absolues pour les fichiers dans votre répertoire documents et vous risqueriez de données sur les causes de la perte. C'est parce que lorsque vous mettez à jour une application, en changeant son numéro de version dans le .fichier plist, iOS crée un nouveau répertoire pour cette application avec un autre nom hexadécimal. Maintenant, votre URL absolue référence à l'emplacement incorrect et ne retourne pas le bon fichier.

Vous pouvez voir cela sur votre propre ordinateur avant même de le déployer sur un appareil en accédant à

~/Bibliothèque/Application Support/Simulateur d'iPhone/*ios_version*/Applications/

Vous y verrez des dossiers avec des noms comme:

6AA4B05C-8A38-4469-B7BE-5EA7E9712510 CB43C5F3-D720-49C3-87D4-EBE93FFD428B

À l'intérieur de ces dossiers sera la norme de système de fichiers de mise en page pour les applications iOS. c'est à dire

Documents Bibliothèque tmp YourApp.app

Par la référence à l'URL en entier, vous verrez quelque chose comme,

~/Bibliothèque/Application Support/iPhone Simulator/*ios_version*/Applications/6AA4B05C-8A38-4469-B7BE-5EA7E9712510/Documents/MyVeryImportantUserData.txt

Toutefois, lorsque vous mettez à jour l'application de la nouvelle URL que l'application sera:

~/Bibliothèque/Application Support/iPhone Simulator/*ios_version*/Applications/CB43C5F3-D720-49C3-87D4-EBE93FFD428B/Documents/MyVeryImportantUserData.txt

qui est vide.

Au lieu de cela, vous devez toujours faire un renvoi dynamique par seulement enregistrer le chemin d'accès du fichier après que vous ayez obtenu le répertoire documents filepath préfixe.

/**
 Returns the path to the application's Documents directory.
 */
- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

À l'affiche originale, vous pourriez avoir enregistré vos utilisateurs des données perdues par l'émission d'une nouvelle mise à jour où vous avez modifié votre code afin de prendre l'url absolue et tout garniture à travers les documents de la partie de la chaîne. Ensuite, vous pouvez préfixer le chemin du fichier avec le bon répertoire documents de l'url et l'application aurait trouvé les données.

1voto

sqlexception Points 21

À la fois la question de l'affiche et la première réponse a été utile d'en préciser exactement ce qui se passait.

Donc, en s'appuyant sur leurs observations, je me suis rendu compte qu'il y a (ce qui semble être) à un renommage des dossiers dans le chemin qui mène vers le dossier Documents. Cela me diriger vers une solution où je suis en enregistrant uniquement les noms des fichiers et la création d'une classe utilitaire pour extraire le courant fullPath chaîne de caractères du nom de fichier qui a été enregistré et est enregistré dans l' actuel dossier Documents après les mises à jour des applications:

#import "StringUtils.h"

@implementation StringUtils

+ (NSString *)getFullDocumentUrl:(NSString *)fileName
{
    return [NSString stringWithFormat:@"%@/%@",[self applicationDocumentsDirectory],fileName];
}

+ (NSString *)applicationDocumentsDirectory
{
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

@end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X