Как сказал Алекс, вы должны добавить файл базы данных в качестве ресурса в ваш проект. Это даст Xcode команду связать файл базы данных в вашем .app. Этот файл, однако, предназначен только для чтения, вы можете скопировать его в папку документов вашего приложения (на устройстве или в симуляторе, то же самое), где он становится доступным для записи.
Вот код, который я использую для такого рода вещей ниже. Приятная вещь в этом коде заключается в том, что он автоматически обновляет доступную для записи копию в папке с документами вашего приложения всякий раз, когда вы изменяете «основную» копию, входящую в комплект .app. Используйте pathLocal, чтобы открыть свою (доступную для записи) базу данных ...
Приведенная ниже функция возвращает YES, если операция прошла успешно (была необходима копия или нет). Вы можете изменить это на то, что вам подходит:)
NSString *pathLocal, *pathBundle;
// Automatically copy DB from .app bundle to device document folder if needed
- (BOOL)automaticallyCopyDatabase {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
pathLocal = [documentsDir stringByAppendingPathComponent:@"mydb.sqlite"];
pathBundle = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"mydb.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *localAttr = [fileManager fileAttributesAtPath:pathLocal traverseLink:YES];
BOOL needsCopy = NO;
if (localAttr == nil) {
needsCopy = YES;
} else {
NSDate *localDate;
NSDate *appDBDate;
if (localDate = [localAttr objectForKey:NSFileModificationDate]) {
NSDictionary *appDBAttr = [fileManager fileAttributesAtPath:pathBundle traverseLink:YES];
appDBDate = [appDBAttr objectForKey:NSFileModificationDate];
needsCopy = [appDBDate compare:localDate] == NSOrderedDescending;
} else {
needsCopy = YES;
}
}
if (needsCopy) {
NSError *error;
BOOL success;
if (localAttr != nil) {
success = [fileManager removeItemAtPath:pathLocal error:&error];
}
success = [fileManager copyItemAtPath:pathBundle toPath:pathLocal error:&error];
return success;
}
return YES;
}