2010-12-16 5 views
2

J'ai une application basée sur un document qui s'exécute avec des données de base. Le modèle objet a trois entités avec plusieurs propriétés. Il semble fonctionner plutôt bien - je peux remplir certaines informations et les sauvegarder, pas de problème. Quand je vais ouvrir le fichier résultant, cependant, il ouvre toujours "sale", avant même que j'ai touché quelque chose, et quelques champs sont parfois vides. Ce que je veux dire, c'est que parfois vous ouvrez le fichier et ces champs apparaissent vides et d'autres fois vous ouvrez le fichier et ils apparaissent avec les données appropriées. Les propriétés vides sont associées à une seule des entités et sont affichées dans le même NSTabView. Ils sont certains NSStrings affichés en tant que valeurs dans les champs de texte et les étiquettes.Fichier d'ouverture de données de base sale, valeurs manquantes de façon incohérente, extraction renvoie un tableau vide

Mise à jour: Merci aux conseils de @ ughoavgfhw, je suis passé à un magasin XML et trouvé deux problèmes: que je créais une nouvelle entité chaque fois que le document a été ouvert dans le [MyDocument init] au lieu de charger celui enregistré dans la magasin persistant, mais maintenant j'ai des problèmes pour aller chercher celui-là.

Dans le fichier XML résultant après une sauvegarde, il ne comprend ceci (l'entité et les propriétés qui me donne du mal):

<object type="STORY" id="z102"> 
    <attribute name="title" type="string">test 6</attribute> 
    <attribute name="descript" type="string">this is a test</attribute> 
</object> 

et je tente de le chercher avec ceci:

- (Story *)getSavedStory { 
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Story" inManagedObjectContext:[self managedObjectContext]]; 
    NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
    [request setEntity:entityDescription]; 
    NSError *error = nil; 
    NSArray *array = [[self managedObjectContext] executeFetchRequest:request error:&error]; 
    if (array == nil) { 
     NSLog(@"%@",error); 
     return nil; 
    } else { 
     return [array lastObject]; 
    } 
} 

Après l'ouverture de ce magasin persistant, cette requête renvoie un tableau vide (et aucune erreur). Des conseils sur où aller à partir d'ici? Sans code, tout ce que je peux faire est de deviner, mais j'imagine que vous faites une configuration lorsque vous chargez le document

+0

pouvez-vous poster le code indiquant comment vous ouvrez le fichier? – MCannon

+0

Je n'ai rien écrit de spécifique pour gérer cela, donc je suis sûr qu'il hérite de cette fonctionnalité de 'NSPersistentDocument'. –

Répondre

2

Vous ne désactivez pas l'enregistrement d'annulation, c'est pourquoi vous l'avez marqué comme "sale". Il y a plusieurs raisons pour lesquelles les données n'ont pas pu être chargées correctement. Les deux situations les plus probables sont les suivantes: a) vous remplacez les données lors de l'initialisation, ou b) les données ne sont pas enregistrées correctement et ne peuvent donc pas être chargées correctement.

Voici comment désactiver l'enregistrement d'annulation:

NSManagedObjectContext *moc; //In your document subclass, get this with [self managedObjectContext]; 
[moc processPendingChanges]; 
[[moc undoManager] disableUndoRegistration]; 
//Make changes here 
[moc processPendingChanges]; 
[[moc undoManager] enableUndoRegistration]; 

Mise à jour de nouvelles informations: Ne pas apporter de modifications aux données de base dans la méthode init. La méthode windowControllerDidLoadNib: est un meilleur choix car tout a été chargé à ce moment là. Voici un exemple qui vérifie une entité Story existante et en crée une nouvelle si nécessaire:

- (void)windowControllerDidLoadNib:(NSWindowController *)windowController { 
    [super windowControllerDidLoadNib:windowController]; 
    NSFetchRequest *req = [[NSFetchRequest alloc] init]; 
    [req setEntity:[NSEntityDescription entityForName:@"Story" inManagedObjectContext:[self managedObjectContext]]]; 
    NSError *err = nil; 
    NSArray *objs = [[self managedObjectContext] executeFetchRequest:req error:&err]; 
    [req release]; 
    if(!objs) { 
     [[NSAlert alertWithError:err] runModal]; 
     return; 
    } 
    NSManagedObject *story = nil; 
    if([objs count] == 0) { 
     [[self managedObjectContext] processPendingChanges]; 
     [[self undoManager] disableUndoRegistration]; 
     story = [NSEntityDescription insertNewObjectForEntityForName:@"Story" inManagedObjectContext:[self managedObjectContext]]; 
     //Additional setup 
     [[self managedObjectContext] processPendingChanges]; 
     [[self undoManager] disableUndoRegistration]; 
    } else story = [objs lastObject]; 
} 
+0

Avez-vous des conseils sur la façon dont vous l'enregistrez? C'est à peu près juste une connexion simple entre le magasin, la sous-classe de document, et les reliures de plume, donc je penche vers cela comme solution probable. Encore une fois, j'utilise la fonctionnalité de sauvegarde intégrée. –

+0

Utilisez un format de magasin XML (j'en ai toujours un à tester lors de l'utilisation de CoreData) et ouvrez-le dans un éditeur de texte pour vous assurer que tout est là. Si quelque chose ne fonctionne pas, vous devez vérifier toutes vos connexions et vous assurer que les classes personnalisées envoient des notifications KVC lorsqu'elles sont modifiées. – ughoavgfhw

+0

Ok, merci, je vais essayer ça. Une question cependant. Je dois finalement le ramener à SQLite, donc avant que j'y mette trop de temps, prévoyez-vous des problèmes que je devrais être au courant de cela? –

Questions connexes