如何删除CSV导出中的额外数据?

时间:2017-11-07 20:28:25

标签: ios objective-c csv core-data

这适用于使用iOS的{​​{1}}个应用。

我在CSV导出中获取了一些我想删除的额外信息。下面是我的代码和我所看到的一个例子。

代码:

Core Data

输出示例:

    NSOutputStream *stream = [[NSOutputStream alloc] initToMemory];
    CHCSVWriter *writer = [[CHCSVWriter alloc] initWithOutputStream:stream encoding:NSUTF8StringEncoding delimiter:','];

    NSManagedObjectContext *managedObjectContext = [self managedObjectContext];
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Notes"];
    self.fetchedObjects = [managedObjectContext executeFetchRequest:fetchRequest error:nil];

    for (NSString *instance in self.fetchedObjects) {
        [writer writeLineOfFields:@[instance.description]];
    }

    [writer closeStream];

    NSData *buffer = [stream propertyForKey:NSStreamDataWrittenToMemoryStreamKey];
    NSString *output = [[NSString alloc] initWithData:buffer encoding:NSUTF8StringEncoding];

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths firstObject];
    NSString * csvPath = [documentsDirectory stringByAppendingPathComponent:@"mydata.csv"];

    if ([MFMailComposeViewController canSendMail]) {
        MFMailComposeViewController * mailView = [[MFMailComposeViewController alloc] init];
        mailView.mailComposeDelegate = self;
        [[mailView navigationBar] setTintColor:[UIColor whiteColor]];
        [mailView setSubject:@"My Subject Line"];

        if (![[NSFileManager defaultManager] fileExistsAtPath:csvPath]) {
            [[NSFileManager defaultManager] createFileAtPath:csvPath contents:nil attributes:nil];
        }

        BOOL res = [[output dataUsingEncoding:NSUTF8StringEncoding] writeToFile:csvPath atomically:NO];

        if (!res) {
            [[[UIAlertView alloc] initWithTitle:@"Error Creating CSV" message:@"Check your permissions to make sure this app can create files so you may email the app data" delegate:nil cancelButtonTitle:@"Okay" otherButtonTitles: nil] show];
        } else{
            NSLog(@"Data saved! File path = %@", csvPath);
            [mailView addAttachmentData:[NSData dataWithContentsOfFile:csvPath] mimeType:@"text/csv" fileName:@"mydata.csv"];
            [self presentViewController:mailView animated:YES completion:nil];
        }

    } else {
        UIAlertView * alertView = [[UIAlertView alloc] initWithTitle:@"Mail Error" message:@"Your device is not configured to send mail." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
    }

我想要的是什么:

我只想从用户输入中保存数据。不是关于实体,id等的额外数据。

同时

我的数据最初未加载到电子邮件中。我必须进入我的<Notes: 0x1c009fb30> (entity: Notes; id: 0xd000000000080000 <x-coredata://597EDC54-FFDE-43FA-8C61-DE67763C1D13/Notes/p2> ; data: { // My data shows here. }) ,然后当我进入我的设置页面并发送数据显示的电子邮件时。会导致这种情况的原因是什么?

1 个答案:

答案 0 :(得分:0)

您获得该结果是因为您依靠description方法获取有关对象的信息。该方法会生成一个字符串,字符串就是您所看到的内容 - 这些字符串不是CSV,或者很容易转换为CSV格式。

我不熟悉CHCSVParser,但看起来您可能希望覆盖description类中的Notes以生成CHCSVParser可以处理的内容。 NSManagedObject上的默认实现 - 这就是您现在正在使用的 - 对于这种情况不是一个好的选择。