文件读取适用于iOS模拟器,但不适用于设备

时间:2015-08-21 23:57:35

标签: ios objective-c cocoa-touch

我制作的应用程序将用于科学数据收集。它通过用户界面收集数据,将其保存为.csv,然后通过电子邮件将该文件读取并发送到预定的收集邮件。它在模拟器中完美运行,但是当我在设备上测试时,代码只返回null。 我也不知道如何检查首先保存在设备上的文件。我确实意识到文件可能不是因为它不在那里而被阅读。

以下是读取文件的代码:

{
    NSLog(@"readFile");
    NSString *appFile = fileData;
    NSFileManager *fileManager=[NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:appFile])
    {
        NSLog(@"found file");
        NSError *error= NULL;
        NSString *resultData = [NSString stringWithContentsOfFile:appFile encoding: NSUTF8StringEncoding error: &error];
        if (error == NULL)
            NSLog(@"No errors in reading");
            return resultData;
    }
    return NULL;
}

与嵌入在Button中的调用一起使用:

- (IBAction)sendData:(UIButton *)sender {
 // reading the data:

 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];

 NSString *strHelp = [self readFile:[documentsDirectory stringByAppendingPathComponent:@"ObservationalData.csv"]];
 NSData *observationalData = [strHelp dataUsingEncoding:NSUTF8StringEncoding ];

 NSLog(@"Data: %@", strHelp); 
 ...
}

以下代码块用于保存数据:

- (IBAction)sendingData:(UIBarButtonItem *)sender {

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
  NSString *documentsDirectory = [paths objectAtIndex:0];

  NSError *error = nil;
  [_csvCollection writeToFile:[documentsDirectory stringByAppendingPathComponent:@"ObservationalData.csv"]
      atomically:YES encoding:NSUTF8StringEncoding error:&error];
  NSLog(@"Data Saved");

}

此按钮也会切换到视图控制器,用户可以在其中更改目标电子邮件。

无论如何,当我在我的设备上运行它时会出现以下错误:

2015-08-21 15:53:07.814 DistenceBasedObservations[5701:1553004] readFile
2015-08-21 15:53:07.815 DistenceBasedObservations[5701:1553004] Data: (null)
2015-08-21 15:53:07.817 DistenceBasedObservations[5701:1553004] ***     Terminating app due to uncaught exception 'NSInvalidArgumentException',   reason: '*** -[__NSCFString stringByAppendingString:]: nil argument'
*** First throw call stack:
(0x275b6137 0x35a2fc77 0x275b607d 0x2822ee23 0xa9481 0x2ac21a7b  0x2ac21a21 0x2ac0c5c5 0x2ac21461 0x2ac21133 0x2ac1aa41 0x2abf0c05  0x2ae6731f 0x2abef607 0x2757c22f 0x2757b643 0x27579cc1 0x274c59a1  0x274c57b3 0x2ec841a9 0x2ac50695 0xaedc9 0x35fd7aaf)
libc++abi.dylib: terminating with uncaught exception of type NSException
Message from debugger: failed to send the k packet

终止发生是因为我将应该包含数据的字符串附加到消息正文。当然,没有字符串。

这是我在模拟器上运行应用程序时的日志输出示例:

2015-08-21 16:44:54.512 DistenceBasedObservations[11827:276484] message >Body: Data are coming from:Left observer, start observing time is:(null), and set max distance: 200.  

2015-08-21 16:44:58.937 DistenceBasedObservations[11827:276484] readFile
2015-08-21 16:44:58.982 DistenceBasedObservations[11827:276484] found file
2015-08-21 16:44:59.002 DistenceBasedObservations[11827:276484] No errors in reading
2015-08-21 16:44:59.002 DistenceBasedObservations[11827:276484] Data: time,observer,lat,long,doe,fawn,buck,distance
2015-08-07 23:51:02 +0000,Right,37.48859,-122.2984,3,1,1,183
2015-08-19 21:11:40 +0000,Front,37.33428,-122.0787,3,3,1,243
2015-08-19 21:12:01 +0000,Front,37.33862,-122.0855,3,1,1,214
2015-08-21 16:45:09.020 DistenceBasedObservations[11827:276484] Mail sent

这就是我认为该文件可能不会首先保存在设备上的原因。变量_csvCollection正确形成,日志输出确认,但我不知道如何检查是设备中的文件。也不是为什么它不保存文件(如果文件没有保存)。设备上有18个演出,因此空间不应成为问题。

提前感谢任何提示。

1 个答案:

答案 0 :(得分:0)

再次感谢rmaddy和zaph的评论!

你告诉我正确的道路。

我将保存数据的代码放入

,这是错误的
-(IBAction)...

,当我把它移到

-(void)prepareForSegue... 

它充当了魅力。这就是修复。

再次感谢您的评论。