如果不存在则创建数据库文件

时间:2012-05-22 21:15:02

标签: objective-c ios sqlite fmdb

我正在尝试在第一个应用程序的启动时创建数据库文件。使用过的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 个答案:

答案 0 :(得分:2)

您的主捆绑包中似乎没有名为“FriendsDatabase.sqlite3”的文件。 (如果您有一个,则-copyItemAtPath:toPath:error:调用中的源路径不会为nil。)

尝试将代码更改为:

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

然后使用调试器逐步执行代码并检查path的值。

请注意,您已将“FriendsDatabase”(请注意's')指定为代码中文件的名称,但您的注释会调用文件“FriendDatabase”。也许你刚刚拼错了代码中的文件名 - 这是使用常量的一个很好的理由!

答案 1 :(得分:1)

Caleb的回答是正确的,但我要补充一点,你必须确保sqlite3文件是你的目标成员。在XCode中,选择您的sqlite3文件,然后在“Target Membership”下打开“File Inspector”面板(右侧面板)。确保检查目标应用。

相关问题