2017-11-03 29 views
0

私はまだSMStore.Type(Seam3)への既存のNSSQLiteStoreの適切な移行をセットアップしようとしており、奇妙な問題が発生しています。それがなぜ起こるのか理解できません。私はthe same for Paul on githubを募集しましたが、おそらく誰かが私のコードでその原因に気づき、助けることができるでしょう、そして、ポールは忙しいです。NSSQLiteのSeam3ストレージタイプへの移行がEXC_BAD_ACCESSで失敗する

何がありますか: デフォルトフォルダにNSSQLiteStoreがあるiOS 10以降で動作するアプリケーション。テストの

ステップ:

  1. (存在する場合)は、新しいストアを削除し、それが新しいパスにあるファイルをサポートしています: ファイル:///ユーザ/ DJ-グロック/ライブラリ/開発/ CoreSimulator /デバイス/3708F142-3BD0-4C70-8515-217B7785D285/data/Containers/Data/Application/29B60BBC-0D17-4D6C-8107-0135C45B20BA/Documents/CafeManagerSeam3.sqlite

  2. 実行アプリ。新しいストアが存在するかどうかをアプリは確認する必要があります。そうでない場合は、デフォルトのものから移行を実行します。

  3. Appはストアを移行しようとし、EXC_BAD_ACCESSで失敗します。 しかし同時に、私は新しい店が新しい道に現れたのを見ることができます。もし私がもう一度appを走らせると、目に見える問題のない新しい店を使います。

enter image description here

マイコード:

@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate { 
    var window: UIWindow? 
    var smStore: SMStore? 

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { 

     if #available(iOS 10.0, *) { 
     let storeDescriptionType = AppDelegate.persistentContainer.persistentStoreCoordinator.persistentStores.first?.type 
      if storeDescriptionType == SMStore.type { 
       print("Store is SMStore") 
       print() 
       self.smStore = AppDelegate.persistentContainer.persistentStoreCoordinator.persistentStores.first as? SMStore 
      } 
     } else { 
      let storeDescriptionType = AppDelegate.managedObjectContext.persistentStoreCoordinator?.persistentStores.first?.type 
      if storeDescriptionType == SMStore.type { 
       print("Store is SMStore") 
       print() 
       self.smStore = AppDelegate.managedObjectContext.persistentStoreCoordinator?.persistentStores.first as? SMStore 
      } 
     } 
... 
    // MARK: - Core Data stack for iOS 10+ 
    @available(iOS 10.0, *) 
    static var persistentContainer: NSPersistentContainer = { 
     let container = NSPersistentContainer(name: "CafeManager") 
     let persistentStoreCoordinator = container.persistentStoreCoordinator 

     //MARK: Initializing Seam3 
     SMStore.registerStoreClass() 
     SMStore.syncAutomatically = true 

     //MARK: Preparing URL 
     let applicationDocumentsDirectory: URL = { 
      let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) 
      return urls[urls.count-1] 
     }() 
     let newURL = applicationDocumentsDirectory.appendingPathComponent("CafeManagerSeam3.sqlite") 

     //MARK: Check if SQLite store has been already migrated by checking if CafeManagerSeam3.sqlite exists. 
     let seamStoreExists = FileManager.default.fileExists(atPath: newURL.path) 

     if seamStoreExists { 
      //If exists, then use it because it has been already migrated to Seam3 storage 
      print("Already migrated, using \(newURL)") 

      let storeDescription = NSPersistentStoreDescription(url: newURL) 
      storeDescription.type = SMStore.type 
      storeDescription.setOption("iCloud.iGlock.CafeManager.com" as NSString, forKey: SMStore.SMStoreContainerOption) 
      storeDescription.setOption(NSNumber(value:SMSyncConflictResolutionPolicy.clientTellsWhichWins.rawValue), forKey:SMStore.SMStoreSyncConflictResolutionPolicyOption) 
      container.persistentStoreDescriptions=[storeDescription] 

      container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
       if let error = error as NSError? { 
        fatalError("Unresolved error \(error), \(error.userInfo)") 
       } 
      }) 
      return container 

     } else { 
      //If does not exist, then migrate old storage to Seam3. 
      print("Not yet migrated, migrating to \(newURL)") 

      //Loadig default store 
      container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
       if let error = error as NSError? { 
        fatalError("Failed to load default store \(error), \(error.userInfo)") 
       } 
      }) 
      let defaultPersistentStore = container.persistentStoreCoordinator.persistentStores.last 
      print("Default store is located here: \(defaultPersistentStore!.url!)") 

      //Adding new Seam3 store 
      do { 
       try persistentStoreCoordinator.addPersistentStore(ofType: SMStore.type, configurationName: nil, at: newURL, options: nil) 
       print("Seam store was added to the new url: \(newURL)") 
      } catch { 
       fatalError("Failed to add new Seam store: \(error)") 
      } 

      //Migrating default store to new Seam store 
      do { 
       try persistentStoreCoordinator.migratePersistentStore(defaultPersistentStore!, to: newURL, options: nil, withType:SMStore.type) 
       //Removing old store 
       if defaultPersistentStore != nil { 
        do { 
         try persistentStoreCoordinator.remove(defaultPersistentStore!) 
        } catch { 
         fatalError("Failed to remove default store \(error)") 
        } 
       } 
      } 
      catch { 
       fatalError("Failed to migrate to Seam store: \(error)") 
      } 

      //Setting additional parameters to Seam store to make it able to use CloudKit 
      let storeDescription = NSPersistentStoreDescription(url: newURL) 
      storeDescription.type = SMStore.type 
      storeDescription.setOption("iCloud.iGlock.CafeManager.com" as NSString, forKey: SMStore.SMStoreContainerOption) 
      storeDescription.setOption(NSNumber(value:SMSyncConflictResolutionPolicy.clientTellsWhichWins.rawValue), forKey:SMStore.SMStoreSyncConflictResolutionPolicyOption) 
      container.persistentStoreDescriptions=[storeDescription] 

      return container 
     } 

出力:

objc[52621]: Class _NSZombie_OS_xpc_endpoint is implemented in both ?? (0x618000048340) and ?? (0x600000047290). One of the two will be used. Which one is undefined. 
CoreData: annotation: Failed to load optimized model at path '/Users/dj-glock/Library/Developer/CoreSimulator/Devices/3708F142-3BD0-4C70-8515-217B7785D285/data/Containers/Bundle/Application/0B098A31-C927-44C0-87C2-2F2B944DF66C/CafeManager.app/CafeManager.momd/CafeManager v2.omo' 
Already migrated, using file:///Users/dj-glock/Library/Developer/CoreSimulator/Devices/3708F142-3BD0-4C70-8515-217B7785D285/data/Containers/Data/Application/932E6B3A-65B1-44F1-920B-DCE5F242C9C7/Documents/CafeManagerSeam3.sqlite 
Store is SMStore 

Sync Started 
No more records coming 
Sync Performed 
Sync performed successfully 
//some test insert that was loaded to Cloud. 
Sync Started 
No more records coming 
Sync Performed 
Sync performed successfully 
:私はそれのクラッシュ後にアプリを再実行

CoreData: annotation: Failed to load optimized model at path '/Users/dj-glock/Library/Developer/CoreSimulator/Devices/3708F142-3BD0-4C70-8515-217B7785D285/data/Containers/Bundle/Application/3E4EB624-227E-4BD0-99F1-AA975D86BDA8/CafeManager.app/CafeManager.momd/CafeManager v2.omo' 
Not yet migrated, migrating to file:///Users/dj-glock/Library/Developer/CoreSimulator/Devices/3708F142-3BD0-4C70-8515-217B7785D285/data/Containers/Data/Application/100FB44C-C881-44C1-9D03-454FEBDB092B/Documents/CafeManagerSeam3.sqlite 
Default store is located here: file:///Users/dj-glock/Library/Developer/CoreSimulator/Devices/3708F142-3BD0-4C70-8515-217B7785D285/data/Containers/Data/Application/100FB44C-C881-44C1-9D03-454FEBDB092B/Library/Application%20Support/CafeManager.sqlite 
Seam store was added to the new url: file:///Users/dj-glock/Library/Developer/CoreSimulator/Devices/3708F142-3BD0-4C70-8515-217B7785D285/data/Containers/Data/Application/100FB44C-C881-44C1-9D03-454FEBDB092B/Documents/CafeManagerSeam3.sqlite 
2017-10-31 17:49:47.762 CafeManager[52561:7472303] Access to CloudKit has not been verified by calling verifyCloudKitConnection 
(lldb) po self 
error: Trying to put the stack in unreadable memory at: 0x7ffee595ef80. 
(lldb) 
What am I doing wrong? Is it my misunderstanding of CoreData stack or something else? 

出力

答えて

0

エラーが解決されました。 Paulからexampleを使用しました。

{ 
      // If does not exist, then migrate old storage to Seam3. 
      print("Not yet migrated, migrating to \(newURL)") 
      SMStore.syncAutomatically = false 

      // Loadig default store 
      container.loadPersistentStores(completionHandler: { (storeDescription, error) in 
       if let error = error as NSError? { 
        fatalError("Failed to load default store \(error), \(error.userInfo)") 
       } 
      }) 
      let defaultPersistentStore = container.persistentStoreCoordinator.persistentStores.last 
      print("Default store is located here: \(defaultPersistentStore!.url!)") 

      //Migrating default store to new Seam store 
      do { 
       try persistentStoreCoordinator.migratePersistentStore(defaultPersistentStore!, to: newURL, options: nil, withType:SMStore.type) 
      } 
      catch { 
       fatalError("Failed to migrate to Seam store: \(error)") 
      } 

      //Setting additional parameters to Seam store to make it able to use CloudKit 
      let storeDescription = NSPersistentStoreDescription(url: newURL) 
      storeDescription.type = SMStore.type 
      storeDescription.setOption("iCloud.iGlock.CafeManager.com" as NSString, forKey: SMStore.SMStoreContainerOption) 
      storeDescription.setOption(NSNumber(value:SMSyncConflictResolutionPolicy.clientTellsWhichWins.rawValue), forKey:SMStore.SMStoreSyncConflictResolutionPolicyOption) 
      container.persistentStoreDescriptions=[storeDescription] 
      SMStore.syncAutomatically = true 
      return container 
     } 
関連する問題