NSData在模拟器中加载,但不在Device上加载

时间:2011-03-31 04:04:18

标签: objective-c file-io

如果互联网连接不可用,我正在解析文件中的数据。当我在iphone模拟器中测试它时它完美无缺。当我切换到设备时它失败了。当我保存并加载数据时,我使用了相同的名称,但没有区别。可能是什么问题?

- (void)parseXMLFileAtURL:(NSString *)URL
{
    events = [[NSMutableArray alloc] init];

    NSURL *xmlURL = [NSURL URLWithString:URL];

    NSString* xml = [[NSString alloc]initWithContentsOfURL:xmlURL];
    NSData * xmlData = [xml dataUsingEncoding:NSUTF8StringEncoding]; //[[NSData alloc]initWithContentsOfURL:xmlURL];
    if (xmlData != nil) {
        fileParser = [[NSXMLParser alloc] initWithData:xmlData];
        HBSaveData(xmlData, @"/xml.plist");
        NSLog(@"backup made %@ " ,xmlData);
    } else {
        xmlData = [[[NSData alloc]initWithData:HBLoadData(@"/xml.plist")]retain];

        fileParser = [[NSXMLParser alloc]initWithData:xmlData];
        networkConnected = YES;
        NSLog(@"backup used %@ " ,xmlData);
    }

    [fileParser setDelegate:self];

    [fileParser setShouldProcessNamespaces:NO];
    [fileParser setShouldReportNamespacePrefixes:NO];
    [fileParser setShouldResolveExternalEntities:NO];

    [fileParser parse];

}

这是我第二个问题,我不明白为什么。我已经使用了同样的方法来保存文件3次,现在这次它不想工作。我的另一个问题仍然没有答案。

以下是保存和加载功能

static void HBSaveData(NSData *data, NSString* savePath){
    NSString *filePath = pathOfFile(savePath);
    NSString *errString;
    NSData *serialized =
    [NSPropertyListSerialization dataFromPropertyList:data
                                           format:NSPropertyListBinaryFormat_v1_0
                                 errorDescription:&errString];

[serialized writeToFile:savePath atomically:YES];

if (errString)
{
    NSLog(@"%@" ,errString);
    [errString release]; // exception to the rules
}


//[data writeToFile:filePath atomically:YES];
NSLog(@"%@", filePath);

}

static NSData* HBLoadData(NSString* savePath) {
    NSString *filePath = pathOfFile(savePath);

    NSString *errString;
    NSData *serialized = [NSData dataWithContentsOfFile:savePath];



NSData* data =
[NSPropertyListSerialization propertyListFromData:serialized
                                 mutabilityOption:NSPropertyListMutableContainers
                                           format:NULL
                                 errorDescription:&errString];

if (errString)
{
    NSLog(@"%@" ,errString);
    [errString release]; // exception to the rules
}
return data;

}

static inline NSString* pathOfFile(NSString * savePath){

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsFolder = [paths objectAtIndex:0];
return [documentsFolder stringByAppendingPathComponent:savePath];

}

我执行了测试并在读取和写入时查看了文件目录的内容。在模拟器上我有这个。

2011-03-31 08:05:39.117 AnimeSTL [5992:207]所有文件(     “myEventId.plist”     “myEvents.plist”     “myListEvents.plist”     “xml.dat” )

在设备上我得到了这个

2011-03-31 08:11:10.019 AnimeSTL [134:307]所有文件(     “myEventId.plist”     “myEvents.plist”     “myListEvents.plist” ) 由于某种原因,文件没有被保存。

编辑: 写入失败,所以无论如何我输出文件路径。是因为iphone无法处理.dat类型的文件吗?

2011-03-31 09:48:50.954 AnimeSTL [196:307]所有文件(     “myEventId.plist”     “myEvents.plist”     “myListEvents.plist” ) 2011-03-31 09:48:50.960 AnimeSTL [196:307]写失败 2011-03-31 09:48:50.962 AnimeSTL [196:307] /var/mobile/Applications/FCB4AA53-5450-495B-A190-930535335301/Documents/xml.dat

2 个答案:

答案 0 :(得分:1)

请记住,iOS文件系统区分大小写,而Mac OS X文件系统通常不区分大小写。因此,如果您的文件实际上名为“XML.plist”而不是“xml.plist”,那么它将在模拟器上运行,但不在设备上运行。

答案 1 :(得分:0)

/xml.plist是文件的完整路径(根文件夹中的xml.plist),还是在HBSaveData()中修改了该路径?

如果这是实际路径,那可能是您的问题 - iOS只允许您在特定于您的应用的文件夹中写入文件系统。请使用NSSearchPathForDirectoriesInDomains()查找应用的文档文件夹。

相关问题