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

Ответ Калеба правильный, но я бы добавил, что вы должны убедиться, что файл sqlite3 является членом вашей цели. В XCode выберите файл sqlite3, затем откройте панель «File Inspector» (правая панель) в разделе «Target Membership». Убедитесь, что целевое приложение проверено.