Jak powiedział Alex, trzeba dodać plik bazy danych jako zasób do swojego projektu. Spowoduje to polecenie Xcode do pakowania pliku bazy danych w pliku .app. Ten plik jest jednak tylko do odczytu, od Ciebie zależy, czy skopiujesz go do folderu dokumentów aplikacji (na urządzeniu lub symulatorze, to samo), gdzie zasadniczo jest zapisywalny.
Oto kod, którego używam do tego rodzaju rzeczy poniżej. Zaletą tego kodu jest to, że automatycznie odświeży on zapisywalną kopię w folderze dokumentów aplikacji za każdym razem, gdy zmienisz "główną" kopię zawartą w pliku .app. Użyj "pathLocal", aby otworzyć swoją (zapisywalną) bazę danych ...
Poniższa funkcja zwraca TAK, gdy operacja się powiedzie (bez względu na to, czy kopia była potrzebna, czy nie). Jesteś wolny, aby zmienić to, co pasuje do ciebie :)
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;
}
Dzięki Alex. Ale czy mogę zapisać do bazy danych, jeśli została ona dołączona do pakietu aplikacji? – Skoota
Nie, ale możesz skopiować "wstępnie zainicjowaną" podstawową bazę danych do folderu "Dokumenty", który można zapisać. Fajną rzeczą jest to, że takie podejście pozwala również użytkownikowi "zresetować" aplikację. –
Dzięki Alex. To bardzo dobre podejście. – Skoota