“Can't find model for source store” occurring during iphone “Automatic Lightweight Migration”?

≡放荡痞女 提交于 2019-12-28 12:01:31

问题


I'm really stuck here with upgrade testing from v1 to v2 of an iPhone application. I have IPA releases that I'm testing via ad hoc distribution via iTunes to my iPhone device, one for v1 of the app and one for v2. Note that:

  • v1 installs runs fine on my device
  • if I delete v1 and deploy v2 (so no migration) then it works fine
  • when I deploy v2 whilst v1 is already there I get the error: "reason=Can't find model for source store"

A snippet from the error...*

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>
  • when I use "phone disk" to look at my device I see there is Documents/MyApp.sqlite file

Question - Any ideas how to resolve this? What debugging/analysis could I do here? Let me know if you need any more info.

What I have done as an overview is:

  • Deployed my v1 app to the AppStore without setting up a version for my core data model (i.e. wasn't really aware at the time of versions, so didn't set one up)
  • The only additional change for v2 was one new attribute on the one model
  • So for the v2 release what I've done is:
  • Recreated a new Core Data Model
  • Created a v1 version for the model
  • Created the object/attributes for v1
  • Saved
  • Created a v2 version for the model
  • Created the one additional attribute
  • Saved
  • Recreated the managed object classes
  • Updated the code to put the options in per http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmLightweight.html#//apple_ref/doc/uid/TP40008426-SW1 when calling addPersistentStoreWithType

PS fuller version of error if this helps - this time it comes from simulating the migration error on the 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. If this helps the contents of the core data model *.mom directory/package for each version archieve are:

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>

EDIT: Another question that is not clear to me, as raised by reviewing the link jrturton provided below is:

  1. How does one now in the latest XCode version do the "Set Current Version" to the appropriate model version file? i.e. the previous posts highlights two different steps being one Adding Model Version, but then separately "Set Current Version"
  2. How is one supposed to use the Core Data Model "identifier" field which one can set for each of the core data model files. It's in the inspector. The parameter exists against for example the MyApp 1.xcdatamodel, MyApp 2.xcdatamodel, and MyApp.xcdatamodel files, so what do you need to put in each one here?

回答1:


You set the version of your data model in the Utilities inspector (right hand pane), under the Identity and Type tab when the xcdatamodeld file is selected. This has a section called "Core Data Model", and a field called "Identifier".

You add a new model version by selecting the xcdatamodeld file, the going to Editor --> Add model version.

At this point it prompts you for the previous model to base it on.

If youve added a new model without going through this process the lightweight migration may not work.




回答2:


another thing that can cause this, is if you:

  1. make version 2
  2. then edit version 1 accidentally
  3. then make version 2 default
  4. realize your change isn't there
  5. make your change again on version 2

you get the same effect, because the version 1 that you are trying to merge from isn't the version that created the store.




回答3:


If you made changes to your model and you made sure that you generated a model object AND don't care about the migration nor are interested in making a new version, you simply need to do a Product -> Clean and that will typically fix this issue.

If you are still having this error, locate your sqlite DB and delete it. When you launch the app again it will make a new one that's built from the new model.

Alternatively, you can delete the app from the simulator or, if all else fails, tap on "iOS Settings" at the top of simulator and select "Reset Content and Settings..." and it will quickly wipe the simulator so you can start fresh.




回答4:


Xcode 8, i had this issue without doing migration

Can't find model for source store

what i did is simply

Simulator > Reset Content and Settings


来源:https://stackoverflow.com/questions/7624502/cant-find-model-for-source-store-occurring-during-iphone-automatic-lightweig

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!