2015-07-28 4 views
13

Abbiamo avuto 2 app separate che abbiamo unito a 2 destinazioni nello stesso spazio di lavoro. Entrambi avevano il loro modello di dati di base (app1.xcdatamodeld e app2.xcdatamodeld).Ridenominazione di file .xcdatamodeld e migrazione coredata

Ora che entrambi si trovano nello stesso spazio di lavoro, non sono necessari 2 modelli poiché sono simili al 99%. Quindi voglio cambiare il nome del pacchetto a allApps.xcdatamodeld. Sono stato in grado di rinominarlo ma non trovo alcun riferimento al comportamento della migrazione quando lo faccio.

Questo è l'errore -

2015-07-28 09:04:06.079 AppName[51306:1423128] CoreData: error: 
-addPersistentStoreWithType:SQLite configuration:(null) URL:file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite 
options:{ 
    NSInferMappingModelAutomaticallyOption = 1; 
    NSMigratePersistentStoresAutomaticallyOption = 1; 
    NSSQLitePragmasOption =  { 
     "journal_mode" = WAL; 
    }; } ... returned error Error Domain=NSCocoaErrorDomain Code=134130 "The operation couldn’t be completed. (Cocoa error 
134130.)" UserInfo=0x7fc39c194360 {URL=file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite, 
metadata={ 
    NSPersistenceFrameworkVersion = 519; 
    NSStoreModelVersionHashes =  { 
     Attempt = <b4d1e878 69a97917 e751a67c 89e1887a ae4df1dc f380e4ee c9585f60 f39ff51e>; 
     BookmarkFlashcard = <33112f7c 2fa20bec eb2e019c b5d619b4 92be2547 a65fabee 1ac86ab7 92dd77bb>; 
     BookmarkQuestion = <38634b49 71f0d43c 6f9fbba9 bc2f1b81 675c9b3c f2da017e fc8de9d8 4e18a4a0>; 
     Category = <b0e4d91b 0c0ebc71 ed0f403c 9a0eec20 fc1686aa 0169bc60 4bcc7e57 165bce15>; 
    }; 
    NSStoreModelVersionHashesVersion = 3; 
    NSStoreModelVersionIdentifiers =  (
     "" 
    ); 
    NSStoreType = SQLite; 
    NSStoreUUID = "F1B37CD0-8B89-4893-A262-1013C3544026"; 
    "_NSAutoVacuumLevel" = 2; }, reason=Can't find model for source store} with userInfo dictionary { 
    URL = "file:///Users/shani/Library/Developer/CoreSimulator/Devices/EA75A69F-B108-4036-AB3D-B923F83D16DE/data/Containers/Data/Application/B1CB3AF3-DEF4-40DF-9A61-721063ECBB1D/Documents/AppName.sqlite"; 
    metadata =  { 
     NSPersistenceFrameworkVersion = 519; 
     NSStoreModelVersionHashes =   { 
      Attempt = <b4d1e878 69a97917 e751a67c 89e1887a ae4df1dc f380e4ee c9585f60 f39ff51e>; 
      BookmarkFlashcard = <33112f7c 2fa20bec eb2e019c b5d619b4 92be2547 a65fabee 1ac86ab7 92dd77bb>; 
      BookmarkQuestion = <38634b49 71f0d43c 6f9fbba9 bc2f1b81 675c9b3c f2da017e fc8de9d8 4e18a4a0>; 
      Category = <b0e4d91b 0c0ebc71 ed0f403c 9a0eec20 fc1686aa 0169bc60 4bcc7e57 165bce15>; 
     }; 
     NSStoreModelVersionHashesVersion = 3; 
     NSStoreModelVersionIdentifiers =   (
      "" 
     ); 
     NSStoreType = SQLite; 
     NSStoreUUID = "F1B37CD0-8B89-4893-A262-1013C3544026"; 
     "_NSAutoVacuumLevel" = 2; 
    }; 
    reason = "Can't find model for source store"; } 2015-07-28 09:04:06.089 AppName[51306:1423128] CoreData: annotation: 
NSPersistentStoreCoordinator's current model hashes are { 
    Attempt = <b4d1e878 69a97917 e751a67c 89e1887a ae4df1dc f380e4ee c9585f60 f39ff51e>; 
    BookmarkFlashcard = <33112f7c 2fa20bec eb2e019c b5d619b4 92be2547 a65fabee 1ac86ab7 92dd77bb>; 
    BookmarkQuestion = <38634b49 71f0d43c 6f9fbba9 bc2f1b81 675c9b3c f2da017e fc8de9d8 4e18a4a0>; 
    Category = <b0e4d91b 0c0ebc71 ed0f403c 9a0eec20 fc1686aa 0169bc60 4bcc7e57 165bce15>; } 

Esiste un modo per rinominare name1.xdatamodel a name2.xdatamodel in un app che è già in produzione?

Grazie

+0

Qual è stato il risultato delle vostre prove? – Mundi

+0

@Mundi Errore aggiunto, grazie. – shannoga

risposta

7

Invece di rinominare l'app1.xcdatamodeld o app2.xcdatamodeld si dovrebbe creare una nuova (allApps.xcdatamodeld). Questo nuovo modello può essere solo una copia di qualsiasi modello tu voglia mantenere.

Quindi in ciascuna delle due destinazioni aggiungere un file .xcmappingmodel e collegarlo a allApps.xcdatamodeld ed eseguire le traduzioni necessarie.

Il modo in cui funziona CoreData, ti consigliamo di mantenere l'app1 originale e App2 file xcdatamodeld intorno per assicurarsi che non hai mai rompere un utente che succede ad avere il vostro molto più antica applicazione ancora in esecuzione sul proprio dispositivo.

File> Nuovo> File> Dati principali> Modello di mappatura. Scegliere il modello di origine e fare clic su Avanti. enter image description here

Scegliere il modello di dati di destinazione e fare clic su Avanti. enter image description here

Ripeti nell'altro target per app2 e dovresti essere OK.

+0

Grazie, lo proverò – shannoga

2

Try using versioning and lightweight migration,

Per ulteriori nel corso delle versioni e la migrazione è possibile check this out.

Se sopra non aiuta poi provare in questo modo,

In primo luogo, quando si aggiunge un modello di dati di base in xcode, si ottiene effettivamente un file .xcdatamodeld che è un pacchetto come il file .xcodeproj. Nel Finder, puoi fare clic con il pulsante destro del mouse e "Mostra contenuto pacchetto". Vedrai che contiene un file .xcdatamodel.

Mi sembra che non è possibile rinominarlo completamente utilizzando xcode. Xcode cambierà il nome del file del pacchetto (il momd) come lo vedi nell'interfaccia utente, ma sul file system non è stato effettivamente modificato.

L'errore del modello nil che si ottiene è perché non riesce a trovare il nomefile del nuovo nome poiché ha ancora il vecchio nome sul disco. (Immagino)

Ho lavorato su questo creando un nuovo modello con il nome che volevo, quindi nel modello esistente, puoi trascinare e selezionare le tue entità, quindi incollarle nel nuovo file del modello. È quindi possibile eliminare quello vecchio e salvare tutte le modifiche sul tuo SCM.

è possibile ottenere più aiuto per quanto riguarda i passaggi precedenti da this link.

0

Basta fare clic con il tasto destro del mouse su .xcdatamodeld Mostrare nel Finder e rinominarlo. Rimuovi dal gruppo che ne esce uno e Trascina e rilascia Rinomina .xcdatamodeld, Ora pulisci la build, Verifica prima di eseguire la relazione tra i modelli se ce l'hai ed Esegui di nuovo.

0
  1. Aggiungere Modello Versione
  2. cambio di versione attuale modello di nuovo, quindi eliminare versione del modello inutilizzato step 2 detail