CoreData Datenbank leer trotz Kopierens

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CoreData Datenbank leer trotz Kopierens

    Hi,
    ich habe von einen anderen Entwickler eine App übernommen und führe diese nun weiter. Der andere Entwickler hat "MagicalRecord" für die ganze CoreDate Geschichte genommen. Diese funktioniert leider aber nicht so, wie gewollt und deshalb habe ich ich entschlossen, da ich es persönlich auch besser finde das ganze ohne "MagicalRecord" umzusetzen und dafür die normal von Apple zur Verfügung gestellten Methoden zu nehmen. Dies funktioniert auch so weit gut, sodass ich mich an die Datenmigration begeben habe. Denn "MagicalRecord" speichert es woanders ab, als ich es haben möchte. Ich habe mir einfach gedacht, ich nehme die Datenbank und kopiere die von A nach B. Das mache ich so:

    Quellcode

    1. [MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:@"local-database.sqlite"];
    2. NSURL *oldUrl = [NSPersistentStore MR_urlForStoreName:@"local-database.sqlite"];
    3. NSString *directory = [[NSFileManager defaultManager] applicationDocumentsDirectory];
    4. NSString *localDataPath = [directory stringByAppendingPathComponent:@"Databse.sqlite"];
    5. NSFileManager *fileManger = [NSFileManager defaultManager];
    6. // remove previous local version
    7. if ([fileManger fileExistsAtPath:localDataPath]) {
    8. [fileManger removeItemAtPath:localDataPath error:nil];
    9. }
    10. // made a copy from original location to the new location
    11. NSError *error;
    12. [fileManger copyItemAtPath:[oldUrl path] toPath:localDataPath error:&error];
    13. if (error) {
    14. NSLog(@"%@", error);
    15. }
    Alles anzeigen


    Dies funktioniert ja auch ganz gut und die Datenbank wird dahin kopiert ohne Error aber wenn ich jetzt mein ManagedObjectContext erzeuge und dann die Daten aus der Datenbank holen will, ist die Datenbank leer und es werden keine Daten angezeigt. Warum?? Den MangedObjectContext erzeuge ich so:

    Quellcode

    1. #pragma mark - Core Data stack
    2. - (NSURL *)persistentStoreURL {
    3. NSString *directory = [[NSFileManager defaultManager] applicationDocumentsDirectory];
    4. NSString *file = [directory stringByAppendingPathComponent:@"Kinderdiary.sqlite"];
    5. return [NSURL fileURLWithPath:file];
    6. }
    7. - (NSManagedObjectModel *)managedObjectModel {
    8. if (_managedObjectModel == nil) {
    9. NSURL *theURL = [[NSBundle mainBundle] URLForResource:@"Model" withExtension:@"momd"];
    10. _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:theURL];
    11. }
    12. return _managedObjectModel;
    13. }
    14. - (NSManagedObjectContext *)managedObjectContext {
    15. if (_managedObjectContext == nil) {
    16. NSPersistentStoreCoordinator *theCoordinator = self.persistentStoreCoordinator;
    17. if(theCoordinator != nil) {
    18. _managedObjectContext = [[NSManagedObjectContext alloc] init];
    19. _managedObjectContext.persistentStoreCoordinator = theCoordinator;
    20. [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(dataInCloudHasChanged:) name:NSPersistentStoreDidImportUbiquitousContentChangesNotification object:theCoordinator];
    21. }
    22. }
    23. return _managedObjectContext;
    24. }
    25. - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    26. if((_persistentStoreCoordinator != nil)) {
    27. return _persistentStoreCoordinator;
    28. }
    29. NSPersistentStoreCoordinator *coordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
    30. dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    31. NSString *directory = [[NSFileManager defaultManager] applicationDocumentsDirectory];
    32. NSString *file = [directory stringByAppendingPathComponent:@"Database.sqlite"];
    33. NSURL *localURL = [NSURL fileURLWithPath:file];
    34. if (iCloudURL && self.cloudWanted.boolValue) {
    35. NSLog(@"iCloud is on");
    36. /* TODO */
    37. } else {
    38. NSLog(@"iCloud is of");
    39. NSMutableDictionary *options = [NSMutableDictionary dictionary];
    40. [options setObject:[NSNumber numberWithBool:YES] forKey:NSMigratePersistentStoresAutomaticallyOption];
    41. [options setObject:[NSNumber numberWithBool:YES] forKey:NSInferMappingModelAutomaticallyOption];
    42. [coordinator lock];
    43. [coordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:localURL options:options error:nil];
    44. [coordinator unlock];
    45. }
    46. dispatch_async(dispatch_get_main_queue(), ^{
    47. [self createUI];
    48. [[NSNotificationCenter defaultCenter] postNotificationName:notificationName object:self userInfo:nil];
    49. });
    50. });
    51. _persistentStoreCoordinator = coordinator;
    52. return _persistentStoreCoordinator;
    53. }
    Alles anzeigen


    Stimmt da irgendwas nicht? Mache ich da irgendwas falsch? Vielen Dank für das durchlesen bis hierher!

    Viele Grüße
    Nils
  • Ich habe ein ähnliches Problem mit "save as ..." beobachtet. Eine Lösung dafür habe ich hier github.com/darcyliu/CocoaSampl…FileWrappers/MyDocument.m
    gefunden.

    Im NSPersistentDocument habe ich

    - (BOOL)writeSafelyToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation error:(NSError **)outError

    überschrieben und nun funktioniert das "save as ..." wie erwartet.
    Wenn Du immer nur das tust was du schon kannst - wirst du immer das bleiben, was du heute bist.
  • uschu.do schrieb:

    Ich habe ein ähnliches Problem mit "save as ..." beobachtet. Eine Lösung dafür habe ich hier github.com/darcyliu/CocoaSampl…FileWrappers/MyDocument.m
    gefunden.

    Im NSPersistentDocument habe ich

    - (BOOL)writeSafelyToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation error:(NSError **)outError

    überschrieben und nun funktioniert das "save as ..." wie erwartet.

    Danke aber ich habe ja nirgendwo " save as.." Mein Problem ist ja, dass er die Datenbank zwar kopiert aber eben die Daten die eigentlich drinne sind nicht mehr hat.
  • Beim Kopieren schreibst Du von 'Databse.sqlite', beim persistentStoreURL von 'Kinderdiary.sqlite' und im coordinator schließlich von 'Database.sqlite'…
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P
  • Marco Feltmann schrieb:

    Beim Kopieren schreibst Du von 'Databse.sqlite', beim persistentStoreURL von 'Kinderdiary.sqlite' und im coordinator schließlich von 'Database.sqlite'…

    Danke für die Antwort! Das habe ich aber nur fürs Forum umgeändert. Habe gerade noch mal geschaut auch auf das Device wie da die Datenbanken heißen und das stimmt. Aber dadurch bin ich drauf gekommen, was ich falsch gemacht habe! Danke!! Man muss nicht nur die .sqlite kopieren sondern auch die .sqlite-sh und die .slqlite-was. Dann erst funktioniert es! Danke für den Denkanstoß!
  • Und ich wollte die ganze Zeit schon sagen "CoreData besteht aus mehr als nur einer sqlite datei". Aber irgendwie war ich davon ausgegangen das das jedem klar ist. Sonst wäre es ja nur SQLite :)

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)