2011-11-08 2 views
0

데이터베이스를 NSBundle에서 문서 디렉토리로 복사하려고합니다.NSBundle에서 문서 디렉토리로 파일을 복사 할 수 없습니다.

이 파일을 복사하는 코드입니다 :

- (NSString *) getDBPath 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingString:@"Mydata.sqlite"]; 
} 

- (void) copyDatabaseIfNeeded 
{ 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSString *dbPath = [self getDBPath]; 
    BOOL success = [fileManager fileExistsAtPath:dbPath]; 

    if(!success) { 

    NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Mydata.sqlite"]; 
    success = [fileManager copyItemAtPath:defaultPath toPath:dbPath error:&error]; 

    if (!success) 
     NSAssert1(0, @"Failed to create writable file with message '%@'.", [error localizedDescription]); 
    } 
} 

는하지만 왜 내가 내 아이 패드에이 응용 프로그램을 실행할 때, 그것은 충돌이다?

+0

오류 메시지 란 무엇입니까? – Nekto

+0

내가 왜 충돌하는지 알아 냈습니다! 문제는 여기에 있습니다. return [documentsDir stringByAppendingString : @ "Mydata.sqlite"]; 대신 stringByAppendingPathComponent를 사용해야합니다. – Lloydworth

답변

0

확인이 줄 난 당신이 내 충고가 시작시 DB "이동"을 관리하는 코어 데이터를 사용하는 경우이 잘못된 경로

+0

오, 이런. 나는 질문을 게시하는 동안 실수를했다. 예, "Mydata.sqlite"로 변경했지만 여전히 충돌합니다. – Lloydworth

+0

sqlite extension.S를 사용하여 파일을 만들었습니다. –

0

생각

NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Photo.png"]; 

. Core Data Stack 관리를 사용하십시오 (내장 된 Teplate에서 무료로 얻을 수 있습니다).

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 

    if (persistentStoreCoordinator_ != nil) { 
     return persistentStoreCoordinator_; 
    } 

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"MyData.sqlite"]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if (![fileManager fileExistsAtPath:storePath]) { 
     NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"MyData" ofType:@"sqlite"]; 
     if (defaultStorePath) { 
      [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL]; 
     } 
    } 

    NSURL *storeURL = [NSURL fileURLWithPath:storePath]; 

    NSError *error = nil; 
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]]; 
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    }  

    return persistentStoreCoordinator_; 
} 

- (NSString *)applicationDocumentsDirectory { 
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
} 

데이터를 관리 할 때 항상이 코드를 사용합니다.

관련 문제