2010-07-23 4 views
0

En synchronisant les données de mon site Web avec mon application, j'utilise NSXMLParser pour ce faire. Le problème est que tous les champs de ma base de données sont définis en tant que chaînes. Le processus de synchronisation fonctionne correctement quand tout est une chaîne de caractères, mais cela me cause plus de chagrin quand j'essaie d'utiliser ces données à d'autres fins.Types de données et XMLParser

Quelqu'un peut-il me aider à définir mes champs avec les types de données correctes pour le processus de synchronisation, le code ci-dessous:

.m

// Array for WORKOUT. 
    NSMutableString *currentID, *currentUserID, *currentWalkID, *currentDate, *currentDistance, *currentRepeats, *currentType, *currentIntensity, 
    *currentComments, *currentTime, *currentWeight, *currentHeight; 

Je sais que quelque chose à voir avec ce NSMutableString, évidemment tout est défini comme une chaîne.

.h

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{   
    currentElement = [elementName copy]; 

    // Check for the WORKOUT details in the XML feed. 
    if ([elementName isEqualToString:@"workout"]) 
    { 
     // clear out our workout item caches... 
     item = [[NSMutableDictionary alloc] init]; 
     currentID = [[NSMutableString alloc] init]; 
     currentUserID = [[NSMutableString alloc] init]; 
     currentWalkID = [[NSMutableString alloc] init]; 
     currentDate = [[NSMutableString alloc] init]; 
     currentDistance = [[NSMutableString alloc] init]; 
     currentRepeats = [[NSMutableString alloc] init]; 
     currentType = [[NSMutableString alloc] init]; 
     currentIntensity = [[NSMutableString alloc] init]; 
     currentComments = [[NSMutableString alloc] init]; 
     currentTime = [[NSMutableString alloc] init]; 
     currentWeight = [[NSMutableString alloc] init]; 
     currentHeight = [[NSMutableString alloc] init]; 
    } 
} 


- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{  
    if ([elementName isEqualToString:@"workout"]) 
    { 
     Workout *newWorkout = [NSEntityDescription insertNewObjectForEntityForName:@"Workout" inManagedObjectContext: self.managedObjectContext]; 

     // save values to an item, then store that item into the array... 
     [item setObject:currentID forKey:@"workout_id"]; 
     [item setObject:currentUserID forKey:@"workout_user_id"]; 
     [item setObject:currentWalkID forKey:@"workout_walk_id"]; 
     [item setObject:currentDate forKey:@"workout_date"]; 
     [item setObject:currentDistance forKey:@"workout_distance"]; 
     [item setObject:currentRepeats forKey:@"workout_repeats"]; 
     [item setObject:currentType forKey:@"workout_type"]; 
     [item setObject:currentIntensity forKey:@"workout_intensity"]; 
     [item setObject:currentComments forKey:@"workout_comments"]; 
     [item setObject:currentTime forKey:@"workout_time"]; 
     [item setObject:currentWeight forKey:@"workout_weight"]; 
     [item setObject:currentHeight forKey:@"workout_height"]; 

     newWorkout.workout_id = currentID; 
     newWorkout.workout_user_id = currentUserID; 
     newWorkout.workout_walk_id = currentWalkID; 
     newWorkout.workout_date = currentDate; 
     newWorkout.workout_distance = currentDistance; 
     newWorkout.workout_repeats = currentRepeats; 
     newWorkout.workout_type = currentType; 
     newWorkout.workout_intensity = currentIntensity; 
     newWorkout.workout_comments = currentComments; 
     newWorkout.workout_time = currentTime; 
     newWorkout.workout_weight = currentWeight; 
     newWorkout.workout_height = currentHeight; 
     [self.workoutArray addObject:newWorkout]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
    // save the characters for the current item... 
    if ([currentElement isEqualToString:@"workout_id"]) { 
     [currentID appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_user_id"]) { 
     [currentUserID appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_walk_id"]) { 
     [currentWalkID appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_date"]) { 
     [currentDate appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_distance"]) { 
     [currentDistance appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_repeats"]) { 
     [currentRepeats appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_type"]) { 
     [currentType appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_intensity"]) { 
     [currentIntensity appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_comments"]) { 
     [currentComments appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_time"]) { 
     [currentTime appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_weight"]) { 
     [currentWeight appendString:string]; 
    } else if ([currentElement isEqualToString:@"workout_height"]) { 
     [currentHeight appendString:string]; 
} 
+0

Il est un peu difficile de répondre à votre question sans connaître l'entité d'entraînement. S'il vous plaît dites-nous quels champs ont quel type. En outre, il me semble que vous fuyez le dictionnaire de l'article et toutes vos chaînes mutables. Vous devriez libérer l'ancien objet, avant d'en assigner un nouveau. – tonklon

+0

Tous les champs de l'entité d'entraînement sont NSString. – Stephen

+0

Je ne comprends pas votre question alors. Si vous avez besoin d'autres types, modifiez la définition de votre entité. Voulez-vous savoir comment convertir une chaîne en un type différent ??? – tonklon

Répondre

0

XML ne peut cordes porter. Quel que soit le texte interne d'un élément ou la valeur d'un attribut, à la fin tout n'est qu'une chaîne.

Si vous souhaitez envoyer autre chose via XML, le côté émetteur doit l'encoder dans une chaîne et le côté récepteur doit décoder la chaîne. Pour que cela fonctionne les deux parties doivent se mettre d'accord sur un format, par exemple pour une valeur entière, une possibilité est d'encoder 125 comme "125", ou un flottant 2.5 comme "2.5". Si vous utilisez ce format pour vos numéros, vous pouvez les décoder en utilisant les valeurs integerValue et floatValue de NSString.

float test = [@"2.5" floatValue]; 

Il existe des formats standards définis dans xsd, que vous pouvez utiliser, mais cela ne vous aidera à les décoder, si vous ne disposez pas d'un analyseur qui fait cela pour vous. (NSXMLParser ne l'est pas) Si vous utilisez d'autres formats, consultez NSScanner. Pour les dates et heures que vous souhaitez regarder NSDateFormatter.

Si vous avez besoin d'aide pour convertir, veuillez poster le format que vous utilisez, c'est un extrait de votre XML.

Questions connexes