При извлечении всех данных из сущности и печати отображается только последняя запись - PullRequest
0 голосов
/ 21 марта 2012

Я пытаюсь извлечь все данные из определенного основного объекта данных и поместить каждую запись в строку.Однако следующий код печатает только последнюю запись, к которой он обращается.Что я делаю не так?

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Order" inManagedObjectContext:managedObjectContext];

[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:&error];


NSLog(@"=============================================");
NSLog(@"Generating Data To Be Sent");
for (NSManagedObjectContext * info in fetchedObjects) 

{

    NSLog(@"Client Name: %@", [info valueForKey:@"clientName"]);
    NSLog(@"Client Account Number: %@", [info valueForKey:@"clientAccountNumber"]); 
    NSLog(@"Product Code: %@", [info valueForKey:@"productCode"]);
    NSLog(@"Product Price: %@", [info valueForKey:@"productPrice"]);
    NSLog(@"Product Quantity: %@", [info valueForKey:@"productQuantity"]);
    NSLog(@"Order Total: %@", [info valueForKey:@"orderTotal"]);
    NSLog(@"Order ID : %@", [info valueForKey:@"orderID"]); 
    NSLog(@"Transaction ID: %@", [info valueForKey:@"transactionID"]);
    NSLog(@"Sales Rep ID : %@", [info valueForKey:@"salesRepresentativeID"]);

}

NSString * printedData;
NSString * formattedData;

NSString * clientName;
NSString * clientAccount;
NSString * productCode;
NSString * productQuantity;
NSString * productPrice;
NSString * orderTotal;
NSString * orderID;
NSString * transactionID;
NSString * salesRepID;



for(NSManagedObject * info in fetchedObjects)

{

    clientName = [info valueForKey:@"clientName"];
    clientAccount =  [info valueForKey:@"clientAccountNumber"]; 
    productCode =  [info valueForKey:@"productCode"];
    productPrice =  [info valueForKey:@"productPrice"];
    productQuantity = [info valueForKey:@"productQuantity"];
    orderTotal =  [info valueForKey:@"orderTotal"];
    orderID = [info valueForKey:@"orderID"]; 
    transactionID = [info valueForKey:@"transactionID"];
    salesRepID = [info valueForKey:@"salesRepresentativeID"];


    formattedData = [NSString stringWithFormat:@"|%@|%@|%@|%@|%@|%@|%@|%@|%@|\n",clientName,clientAccount,productCode,productQuantity,productPrice,orderID,transactionID,orderTotal,salesRepID];

    printedData = formattedData;

}

NSLog(@"=============================================");
NSLog(@"Data Generated");
NSLog(@"%@",printedData);
[fetchRequest release];

NSMutableArray *recipients = [[NSMutableArray alloc] initWithCapacity:1];
[recipients addObject:toEmail.text];

MFMailComposeViewController *controller = [[MFMailComposeViewController alloc] init];
controller.mailComposeDelegate = self;
[controller setSubject:toSubject.text];
[controller setMessageBody:printedData isHTML:NO];
[controller setToRecipients:recipients];

[self presentModalViewController:controller animated:YES];
[controller release];

Ответы [ 2 ]

1 голос
/ 21 марта 2012

Чтобы исправить вашу начальную проблему, вам нужно использовать NSMutableString.Переменная formattedData не нужна.

...
NSMutableString * printedData = [NSMutableString string];
...

for(NSManagedObject * info in fetchedObjects)
{
    ...
    [printedData appendFormat:@"|%@|%@|%@|%@|%@|%@|%@|%@|%@|\n",clientName,clientAccount,productCode,productQuantity,productPrice,orderID,transactionID,orderTotal,salesRepID];
}
...

Ваша следующая проблема - насколько неэффективен этот код.Вы перебираете одну и ту же коллекцию дважды, один раз для входа, один раз для создания отформатированной строки.Вы можете объединить это в один цикл.Также все переменные определены вне области цикла for, в котором они используются, вы можете просто объявить каждую из них в строке, подобной этой.

for(NSManagedObject * info in fetchedObjects)
{
    NSString *clientName = [info valueForKey:@"clientName"];
    NSString *clientAccount =  [info valueForKey:@"clientAccountNumber"];
    ...
    //Log them all
    NSLog(@"%@",clientName);
    NSLog(@"%@",clientAccount);
    ...
}
0 голосов
/ 21 марта 2012

Если вы пытаетесь объединить все строки formattedData в один NSString printedData, это не то, что делает ваш код, верно?На каждой итерации ваших управляемых объектов вы переустанавливаете printedData.Вот почему вы получаете только последнюю запись.

Я предполагаю, что вы хотите, чтобы напечатанные данные накапливали все строки formattedData, полученные из ваших экземпляров NSManagedObject.Если это так, то вам нужно объявить printedData как NSMutableString и добавить строки formattedData к этой изменяемой строке в каждой итерации ваших управляемых объектов, например

for( NSManagedObject *info in fetchedObjects )
{
    formattedData = [NSString stringWithFormat://blah blah blah
    [printedData appendString:formattedData];
}
...