2012-05-22 36 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

迦勒的答案是正確的,但我想補充一點,你必須確保該sqlite3的文件是你的目標的一員。在XCode中,選擇你的sqlite3文件,然後打開「目標成員」下的「File Inspector」面板(右側面板)。確保您的目標應用程序已被選中。

相關問題