2015-07-28 20 views
13

Mieliśmy dwie oddzielne aplikacje, które połączyliśmy z 2 miejscami docelowymi w tym samym obszarze roboczym. Oba miały swój podstawowy model danych (app1.xcdatamodeld i app2.xcdatamodeld).Zmiana nazwy pliku coredata .xcdatamodeld i migracja

Teraz, gdy obie są w tej samej przestrzeni roboczej, nie ma potrzeby stosowania dwóch modeli, ponieważ są one w 99% podobne. Dlatego chcę zmienić nazwę pakietu .xcdatamodeld na allApps.xcdatamodeld. Byłem w stanie zmienić jego nazwę, ale nie znajduję żadnego odniesienia do zachowania migracji.

Jest to błąd -

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>; } 

Czy istnieje sposób, aby zmienić nazwę name1.xdatamodel do name2.xdatamodel w aplikacji, która jest już w produkcji?

Dzięki

+0

Jaki był wynik swoich badań? – Mundi

+0

@Mundi Dodano błąd, dzięki. – shannoga

Odpowiedz

7

Zamiast zmiany nazwy app1.xcdatamodeld lub app2.xcdatamodeld należy utworzyć nową (allApps.xcdatamodeld). Ten nowy model może być tylko kopią dowolnego modelu, który chcesz zachować.

Następnie w każdym z dwóch celów dodaj plik .xcmappingmodel i połącz go z allApps.xcdatamodeld i wykonaj wszystkie potrzebne tłumaczenia.

Sposób działania coreData, zachowaj oryginalne pliki app1 i app2 xcdatamodeld, aby zapewnić, że nigdy nie złamiesz użytkownika, który ma najstarszą aplikację wciąż działającą na swoim urządzeniu.

Plik> Nowy> Plik> Dane podstawowe> Model odwzorowania. Wybierz model źródłowy i kliknij Dalej. enter image description here

Wybierz docelowy model danych i kliknij Dalej. enter image description here

Zrób to ponownie w swoim drugim celu dla aplikacji 2 i powinieneś być w porządku.

+0

Dzięki, spróbuję tego – shannoga

2

Try using versioning and lightweight migration,

Dla bardziej nad wersjami i migracji można check this out.

Jeśli powyższe nie pomoże spróbuj go w ten sposób,

Po pierwsze, podczas dodawania kluczowy model danych w kodzie Xcode, otrzymujesz plik .xcdatamodeld, który jest pakietem takim jak plik .xcodeproj. W Finderze możesz kliknąć prawym przyciskiem myszy i "Pokaż zawartość pakietu". Zobaczysz, że zawiera plik .xcdatamodel.

Wydaje mi się, że nie można zmienić nazwy w pełni przy użyciu xcode. Xcode zmieni nazwę pliku pakietu (momd), jak widzisz to w interfejsie użytkownika, ale w systemie plików tak naprawdę nie zmieniła się.

Otrzymany błąd modelu zerowego polega na tym, że nie może znaleźć nowej nazwy pliku momd, ponieważ nadal ma starą nazwę na dysku. (Domyślam się)

Pracowałem nad tym, tworząc nowy model o nazwie, którą chciałem, a następnie w istniejącym modelu można kliknąć i przeciągnąć wybrane jednostki, a następnie wkleić je do nowego pliku modelu. Następnie możesz usunąć stary i zatwierdzić wszystkie zmiany w SCM.

można uzyskać pomoc w zakresie powyżej kroków od this link.

0

Wystarczy kliknąć prawym przyciskiem myszy na .xcdatamodeld Pokaż w Finderze i Zmień jego nazwę. Usuń z pakunku po wyjściu z jednego i przeciągnij i upuść Zmieniono nazwę .xcdatamodeld, teraz wyczyść kompilację, sprawdź przed uruchomieniem relację między modelami, jeśli masz i uruchom ponownie.

0
  1. Dodaj model Wersja
  2. Zmień wersję obecnego modelu do nowego, a następnie usunąć nieużywane modelu wersja step 2 detail