본문 바로가기

iOS

[iOS] 번들에서 Document로 파일 복사하기 (sqlite)


sqlite사용할 때(혹은 그 이외에도) 앱 내에서 직접 데이터베이스를 다 만들어 주는것 보다 파이어폭스의 sqlite manager등으로 기본 틀을 만들어 주고, 그렇게 생성된 디비파일을 앱에 추가하여 사용하는게 편하다.

다만 그냥 xcode에서 추가한 상태로 사용하면 해당 파일은 읽기 전용파일이 되므로

번들(간단하게 개발자가 만든 리소스의 모음, Nib파일등등)에서 앱내의 Document폴더로 이동이나 복사를 한 후 사용해야 한다.


파일을 복사하는 코드는 다음과 같다


    NSArray *documentArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,

                                                                NSUserDomainMask,

                                                                YES);

    NSString *documentsDirectory = [documentArr objectAtIndex:0];

    //document 디렉토리의 위치를 알아낸다.

    NSString *documentDBPath = [documentsDirectory stringByAppendingPathComponent:@"seoul.sqlite"];

    //sqlite 파일이 위치할 path 설정

    

    NSFileManager *filemanager = [NSFileManager defaultManager];

    

    BOOL dbexists = [filemanager fileExistsAtPath:documentDBPath];

    if (!dbexists) { //document내에 sqlite 파일이 없다면 번들에서 복사한다.

        NSString *bundleDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"seoul.sqlite"];

        NSLog(@"bundle db %@",bundleDBPath);

        //번들, 개발자가 직접 만든 sqlite 파일의 위치

        NSLog(@"docu db %@", documentDBPath);

        //sqlite 파일이 복사될 도쿠먼트의 위치

        

        NSError *error;

        BOOL success = [filemanager copyItemAtPath:bundleDBPath toPath:documentDBPath error:&error];

        //파일을 복사하는 부분

        

        if (!success) {

            NSLog(@"error : %@",[error localizedDescription]);

        }

    }


여기서 주의할 부분이 몇가지 있는데

NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

사용시 xcode 자동완성을 사용하다보니 NSDocumentationDirectory로 사용하는 경우가 종종 있다.

NSDocumentDirectory라 되어있는지 반드시 확인하자


이 외에도 디렉토리와 파일명을 합하는 메소드를 사용할 때

[documentsDirectory stringByAppendingPathComponent:@"seoul.sqlite"];

stringByAppendingString 을 사용하는 경우가 종종 발생한다. 이럴 경우 에러가 나니 반드시 확인하자.