Work/iOS

iPhone App 개발 시 Documents 폴더에 내 resource DB가 미리 복사되어 있는 경우

kevin. 2010. 6. 30. 10:17

리소스에있는 디비 파일은 읽기 전용이므로 Documents 폴더로 최초에 복사해서 사용하는것이 정석!

그래서 보통 아래와 같은 코드로 프로그램 시작시에 체크하거나 최초 1회에 체크하여 복사하도록 하고있는데...

- (BOOL) copyDatabaseIfNeed {
NSString *myPath = [DOCSFOLDER stringByAppendingPathComponent:@"mydb.db"];
// DB파일 존재 여부 확인
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL exist = [fileManager fileExistsAtPath:myPath];
if(exist) return TRUE;
// DB가 없으면 복사해줌
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"mydb.db"];
NSError *error;
return [fileManager copyItemAtPath:defaultDBPath toPath:myPath error:&error];
}

갑자기 언제부터인가 디비 파일이 0바이트로 복사가 되는 것이 아닌가..

이건 무슨일?

한참을 해매었는데.. 알고보니 위의 메소드를 AppDelegate 클래스의

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

요 메소드에 넣어주었는데...

요놈이 - (id) initWithCoder:(NSCoder *)aDecoder 이놈보다 더 늦게 실행된다는데 문제가 있었다.

- (id) initWithCoder:(NSCoder *)aDecoder 요놈은 xib를 초기화할 때 불리우는 메소드 인데..

지금 만들고 있는 앱의 탭바를 xib로 디자인 하고 각 탭중 한 탭의 클래스에서 저 메소드 안에 디비 사용 루틴을 넣었더니..

디비 파일을 복사하기도 전에 사용하게 되는 꼴이 됐고... 

그렇다면 FMDB에서 에러를 던져야지..그걸 파일을 만들고 앉았으니... 이런..낭패가..

어쨋든 initWithCoder는 조심히 써야겠다!