2011-03-31 3 views
0

인터넷 연결을 사용할 수없는 경우 파일에서 데이터를 파싱합니다. 아이폰 시뮬레이터에서 이것을 테스트 할 때 완벽하게 작동합니다. 장치로 전환하면 실패합니다. 데이터를 저장하고로드 할 때 동일한 이름을 사용하여 대소 문자를 구분하지 않았습니다. 무엇이 문제 일 수 있습니까?시뮬레이터에서 NSData가로드되지만 장치에서는로드되지 않습니다.

- (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); 

I 테스트를 수행하고, 내용에보고

static inline NSString* pathOfFile(NSString * savePath){ 

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

}

}

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; 

} 파일 디 읽기 및 쓰기의 직책. 시뮬레이터에서 나는 이것을 가지고있다.

2011-03-31 08 : 05 : 39.117 AnimeSTL [5992 : 207] 모든 문헌 ( "myEventId.plist" "myEvents.plist" "myListEvents.plist" "xml.dat" 11 : 10.019 AnimeSTL ) 장치에

제가

2011-03-31 08 얻을 [134 : 307] 모든 문헌 ( "myEventId.plist" "myEvents.plist" "myListEvents.plist" ) 파일이 som 용으로 저장되지 않습니다. 전자 이유.

편집 : 쓰기가 실패하여 어쨌든 파일 경로를 출력합니다. 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

답변

1

Mac OS X 파일 시스템은 일반적으로 그렇지 않지만 iOS 파일 시스템은 대소 문자를 구분합니다. 따라서 파일이 실제로 "xml.plist"대신 "XML.plist"라고 불리면 시뮬레이터에서는 작동하지만 장치에서는 작동하지 않습니다.

+0

파일을 저장할 때 모든 소문자로 저장되었으므로 동일한 방식으로 호출했습니다. 두 HBSave/Load 데이터를 보면 전달 된 문자열은 동일합니다.문자열은 파일 정적 함수의 경로에 추가되고 데이터 저장 함수로 전달됩니다. 나는 어떻게 든 물건을 바꾸는거야? 내가 이것을했을 때 나는 꽤 졸 렸어. – Ohmnastrum

+0

장치에서 파일이 문서 디렉토리에 저장되지 않음을 발견했습니다. 나는 이것을 다음과 같이 결정했다 : NSLog (@ "모든 문서 % @", [[NSFileManager defaultManager] directoryContentsAtPath : documentsFolder]); 4 개의 파일 중 3 개가 나타납니다. – Ohmnastrum

+0

코드를 보면 @ ​​"/ xml.plist"를 @ "xml.plist"로 바꿔야 할 것입니다. -stringByAppendingPathComponent : 경로 구분 기호를 삽입합니다. – Caleb

0

/xml.plist은 파일의 전체 경로 (루트 폴더의 xml.plist)입니까, 아니면 HBSaveData()에서 수정되는 경로입니까?

이것이 실제 경로 인 경우 문제 일 가능성이 있습니다. iOS를 사용하면 앱 전용 폴더의 파일 시스템에만 쓸 수 있습니다. NSSearchPathForDirectoriesInDomains()을 사용하여 앱의 문서 폴더를 찾으십시오.

+0

데이터 저장 및로드와 관련된 나머지 코드를 추가했습니다. 나는 어떤 식 으로든 문자열을 수정한다고 생각하지 않습니다. 아니면 내가 아닐까? – Ohmnastrum

관련 문제