it-swarm.com.de

"Modell für Quellspeicher nicht gefunden" tritt während der "automatischen Lightweight-Migration" auf?

Ich bin wirklich hier mit Upgrade-Tests von v1 auf v2 einer iPhone-Anwendung stecken. Ich habe IPA-Versionen, die ich über die Ad-hoc-Verteilung über iTunes auf mein iPhone-Gerät teste, eine für Version 1 der App und eine für Version 2. Beachten Sie, dass:

  • die Installation von v1 läuft auf meinem Gerät einwandfrei
  • wenn ich v1 lösche und v2 bereitstelle (also keine Migration), funktioniert es einwandfrei
  • wenn ich v2 bereitstelle, während v1 bereits vorhanden ist, wird folgende Fehlermeldung angezeigt: "reason = Modell für Quellspeicher nicht gefunden"

Ein Ausschnitt aus dem Fehler ... *

reason=**Can't find model for source store**}, {
         URL = "file://localhost/var/mobile/Applications/AAAAF424-D6ED-40FE-AB8D-66879386739D/Documents/MyApp.sqlite";
         metadata =     {
             NSPersistenceFrameworkVersion = 320;
             <cut>
  • wenn ich mit "phone disk" auf mein Gerät schaue, sehe ich, dass die Datei Documents/MyApp.sqlite vorhanden ist

Frage - Irgendwelche Ideen, wie man das löst? Welches Debuggen/Analysieren könnte ich hier durchführen? Lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.

Was ich als Überblick getan habe, ist:

  • Bereitstellen meiner v1-App im AppStore, ohne eine Version für mein Kerndatenmodell einzurichten (d. H. Zum Zeitpunkt der Versionen war dies nicht wirklich bekannt, sodass keine eingerichtet wurde)
  • Die einzige zusätzliche Änderung für Version 2 war ein neues Attribut für das eine Modell
  • Für die v2-Version habe ich Folgendes getan:
  • Neuerstellung eines neuen Core-Datenmodells
  • Erstellt eine v1-Version für das Modell
  • Erstellt das Objekt/die Attribute für v1
  • Gerettet
  • Erstellt eine v2-Version für das Modell
  • Erstellt das eine zusätzliche Attribut
  • Gerettet
  • Die verwalteten Objektklassen wurden neu erstellt
  • Der Code wurde aktualisiert, um die Optionen in per http://developer.Apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweight.html#//Apple_ref/doc/uid/TP40008426- einzufügen. SW1 beim Aufruf von addPersistentStoreWithType

PS vollere Version des Fehlers, wenn dies hilft - diesmal kommt es von der Simulation des Migrationsfehlers auf dem Simulator

, reason=Can't find model for source store}, {
    URL = "file://localhost/Users/greg/Library/Application%20Support/iPhone%20Simulator/4.3.2/Applications/69FDFDCF-631D-4191-B852-CD75151B1EA9/Documents/MyApp.sqlite";
    metadata =     {
        NSPersistenceFrameworkVersion = 320;
        NSStoreModelVersionHashes =         {
            Config = <5f92f988 71e11a66 554ae924 61887562 22b8de8a c318b110 e3e4a569 81adafa2>;
        };
        NSStoreModelVersionHashesVersion = 3;
        NSStoreModelVersionIdentifiers =         (
            ""
        );
        NSStoreType = SQLite;
        NSStoreUUID = "3B9832DA-E3A1-431B-83E8-43431A7F3452";
    };
    reason = "Can't find model for source store";
}

PSS. Wenn dies hilft, lautet der Inhalt des Kerndatenmodells * .mom Verzeichnis/Paket für jedes Versionsarchiv:

v1

-rw-r--r--   1 greg  staff  1664  5 Sep 21:06 MyApp.mom
-rw-r--r--   1 greg  staff  2656  5 Sep 21:06 MyApp.omo
-rw-r--r--   1 greg  staff   480  5 Sep 21:06 VersionInfo.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd>">
  <plist version="1.0">
    <dict>
      <key>NSManagedObjectModel_CurrentVersionName</key>
      <string>MyApp</string>
      <key>NSManagedObjectModel_VersionHashes</key>
      <dict>
        <key>MyApp</key>
        <dict>
          <key>Config</key>
          <data>
            X5L5iHHhGmZVSukkYYh1YiK43orDGLEQ4+SlaYGtr6I=
          </data>
        </dict></dict></dict>
      </plist>

v2

-rw-r--r--  1 greg  staff   497  2 Oct 12:47 MyApp 1.mom
-rw-r--r--  1 greg  staff  1601  2 Oct 12:47 MyApp 2.mom
-rw-r--r--  1 greg  staff  1695  2 Oct 12:47 MyApp.mom
-rw-r--r--  1 greg  staff  2920  2 Oct 12:47 MyApp.omo
-rw-r--r--  1 greg  staff   665  2 Oct 12:47 VersionInfo.plist

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd>">
  <plist version="1.0">
    <dict>
      <key>NSManagedObjectModel_CurrentVersionName</key>
      <string>MyApp</string>
      <key>NSManagedObjectModel_VersionHashes</key>
      <dict>
        <key>MyApp</key>
        <dict>
          <key>Config</key>
          <data>
            Z/n8092QBHPfBwInZvIm1lei53T1UtZhpNzjl3JA0gs=
          </data>
        </dict>
        <key>MyApp 1</key>
        <dict/>
        <key>MyApp 2</key>
        <dict>
          <key>Config</key>
          <data>
            Fih24clI+kZszFd3X6Gm8itq8YDxudiKnjHW8ydNmps=
          </data>
        </dict></dict></dict>
      </plist>

BEARBEITEN: Eine andere Frage, die mir nicht klar ist, wie durch Überprüfen des unten angegebenen Links jrturton aufgeworfen wird, ist:

  1. Wie kann man nun in der neuesten XCode-Version die "Set Current Version" auf die entsprechende Modellversionsdatei setzen? d.h. die vorherigen Beiträge heben zwei verschiedene Schritte hervor, nämlich einen, der die Modellversion hinzufügt, aber dann separat "Aktuelle Version festlegen".
  2. Wie soll man das Core Data Model "Identifier" -Feld verwenden, das man für jede der Core Data Model-Dateien einstellen kann? Es ist im Inspektor. Der Parameter ist beispielsweise für die Dateien MyApp 1.xcdatamodel, MyApp 2.xcdatamodel und MyApp.xcdatamodel vorhanden. Was müssen Sie hier jeweils einfügen?
20
Greg

Sie legen die Version Ihres Datenmodells im Dienstprogramminspektor (rechter Bereich) auf der Registerkarte Identität und Typ fest, wenn die Datei xcdatamodeld ausgewählt ist. Dies hat einen Abschnitt mit der Bezeichnung "Core Data Model" und ein Feld mit der Bezeichnung "Identifier".

Sie fügen eine neue Modellversion hinzu, indem Sie die Datei xcdatamodeld auswählen und zu Editor -> Modellversion hinzufügen gehen.

An dieser Stelle werden Sie aufgefordert, das vorherige Modell als Grundlage zu verwenden.

Wenn Sie ein neues Modell hinzugefügt haben, ohne diesen Prozess zu durchlaufen, funktioniert die Lightweight-Migration möglicherweise nicht.

37
jrturton

eine andere Sache, die dies verursachen kann, ist, wenn Sie:

  1. mache Version 2
  2. dann bearbeiten Sie Version 1 versehentlich
  3. machen Sie dann Version 2 zum Standard
  4. erkenne, dass dein Wechselgeld nicht da ist
  5. nehmen Sie die Änderung in Version 2 erneut vor

sie erhalten den gleichen Effekt, da die Version 1, aus der Sie eine Zusammenführung durchführen möchten, nicht die Version ist, die den Speicher erstellt hat.

3
Grady Player

Wenn Sie Änderungen an Ihrem Modell vorgenommen haben und sich vergewissert haben, dass Sie ein Modellobjekt generiert haben UND sich nicht um die Migration kümmern oder eine neue Version erstellen möchten, müssen Sie lediglich ein Produkt -> Bereinigen ausführen. Dies wird in der Regel behoben Problem.

Wenn dieser Fehler weiterhin auftritt, suchen Sie Ihre SQLite-Datenbank und löschen Sie sie. Wenn Sie die App erneut starten, wird eine neue App erstellt, die aus dem neuen Modell erstellt wurde.

Alternativ können Sie die App aus dem Simulator löschen oder, falls alles andere fehlschlägt, oben im Simulator auf "iOS-Einstellungen" tippen und "Inhalt und Einstellungen zurücksetzen ..." auswählen. Der Simulator wird dann schnell gelöscht, damit Sie starten können frisch.

1
Travis M.

Xcode 8 , ich hatte dieses Problem ohne Migration

Modell für Quellspeicher kann nicht gefunden werden

was ich getan habe ist einfach

Simulator > Reset Content and Settings
0
Ted