2012-05-22 41 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”面板(右侧面板)。确保您的目标应用程序已被选中。

相关问题