2015-04-17 18 views
6

Ich habe eine bereits veröffentlichte App, die Kerndaten verwenden.
Jetzt möchte ich Unterstützung für Watch-Kit und heutige Erweiterung hinzufügen.Core Data verschieben Daten in gemeinsamen Container

Ich muss Core-Daten in einen gemeinsamen Container verschieben, ohne vorherige gespeicherte Benutzerdaten zu verlieren, wie kann ich das am besten machen?

Antwort

4

Sie können migrieren ein Core Data-Stack. A fuller answer can be found here, aber die kurze Version ist:

  1. Überprüfen Sie, ob die alte nicht-Gruppe Kopie der Daten
  2. existiert Ist dies der Fall, ein Core Data Stack diese Datei einzurichten. Verwenden Sie dann migratePersistentStore:toURL:options:withType:error:, um es an den neuen Speicherort zu verschieben. Dann entfernen Sie die alte Kopie.
  3. Wenn die alte Version nicht existiert, richten Sie Core Data wie gewohnt mit der neuen Kopie ein.

(Das Problem mit Stephen's Antwort ist, dass es davon ausgeht, dass der Core Data-Stack eine einzelne SQLite-Datei ist, was nicht immer der Fall ist.)

+0

Thaks wäre, ist diese Antwort vollständiger ... –

2

So habe ich Core-Daten in den freigegebenen Container in meiner App verschoben. Ich mache das, wenn die App startet.

NSUserDefaults* sharedDefs = [GPMapCore sharedCore].sharedUserDefaults; 
if (![sharedDefs boolForKey:@"CoreDataMovedToExtension"]) 
{ 
    NSURL* oldLocation = GET_LOCATION_OF_CORE_DATA_SQLITE_FILE(); 
    NSURL* newLocation = GET_LOCATON_TO_MOVE_THE_SQLITE_FILE_TO(); 

    if ([[NSFileManager defaultManager] fileExistsAtPath:[oldLocation filePathString]]) 
    { 
     //Check if a new file exists. This can happen when the watch app is run before 
     //Topo Maps+ runs and move the core data database 
     if ([[NSFileManager defaultManager] fileExistsAtPath:[newLocation filePathString]]) 
     { 
      [[NSFileManager defaultManager ] removeItemAtURL:newLocation error:nil]; 
     } 

     [[NSFileManager defaultManager] moveItemAtURL:oldLocation toURL:newLocation error:nil]; 
    } 

    [sharedDefs setBool:YES forKey:@"CoreDataMovedToExtension"]; 
    [sharedDefs synchronize]; 
} 
+0

Ist MoveItem genug oder müssen wir migratePersistentStore tatsächlich: tourl : Optionen: withType: Fehler: –

+0

der Umzug arbeitete für mich, obwohl Sie vielleicht besser mit einem migrieren –