2012-05-22 2 views
1

첫 번째 응용 프로그램 시작시 데이터베이스 파일을 만들려고합니다. FMDB 라이브러리를 사용했습니다. 이 목적을 위해 데이터베이스 파일이 이미 존재하는지 확인하고, 그렇지 않으면 프로젝트에서 데이터베이스 파일을 복사하려고합니다. 내 코드 :존재하지 않을 경우 데이터베이스 파일 생성

-(void)checkAndCreateDatabase { 
NSLog(@"check and create database doing"); 
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; 
NSString *dbFileName = [docDir stringByAppendingPathComponent:@"FriendsDatabase.sqlite3"]; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSError *error; 

if (![fileManager fileExistsAtPath:dbFileName]) { 
    [fileManager copyItemAtPath:[[NSBundle mainBundle] pathForResource:@"FriendsDatabase" ofType:@"sqlite3"] toPath:dbFileName error:&error]; 
    NSLog(@"database created"); 
} else { 
    NSLog(@"fail to create database"); 
} 

FMDatabase *_db = [[FMDatabase alloc] initWithPath: dbFileName]; 
if (![_db open]) { 
    [_db release]; 
    NSLog(@"Could't open DB"); 
    } 
_db.logsErrors = NO; 

self.db = _db; 
[_db release]; 
} 

하지만 오류가 있습니다 : 'NSInvalidArgumentException', reason: '*** -[NSFileManager copyItemAtPath:toPath:error:]: source path is nil'은. 내가 뭘 잘못하고있어?

답변

2

메인 번들에 "FriendsDatabase.sqlite3"이라는 파일이없는 것 같습니다. (당신이 하나를 가지고 있다면, -copyItemAtPath:toPath:error:에 전화의 소스 경로는 전무하지 않을 것입니다.)

이처럼 보이도록 코드를 변경해보십시오 :

NSString *path = [[NSBundle mainBundle] pathForResource:@"FriendsDatabase" ofType:@"sqlite3"]; 
[fileManager copyItemAtPath:path toPath:dbFileName error:&error]; 

그런 다음 디버거 체크와 코드를 단계별로 path의 값

"FriendsDatabase"('s'에주의하십시오)를 코드의 파일 이름으로 지정했지만 주석은 파일 "FriendDatabase"를 호출합니다. 아마도 코드에서 파일 이름의 철자가 틀렸을 것입니다 - 이것은 상수를 사용하는 좋은 이유입니다!

+0

수 없습니다. 나는 "FriendDatabase.sqlite3"을 내 프로젝트에 추가했다. 나는/myProject/디렉토리의 데이터베이스 파일이 어디에 있는지 확인했다. – RomanHouse

+0

위의 편집을 참조하십시오. – Caleb

1

Caleb의 대답은 정확하지만 sqlite3 파일이 대상의 구성원인지 확인해야한다고 덧붙입니다. XCode에서 sqlite3 파일을 선택한 다음 "대상 멤버쉽"아래의 "파일 검사기"패널 (오른쪽 패널)을 엽니 다. 타겟 앱이 선택되어 있는지 확인하십시오.

관련 문제