2017-01-15 6 views
2

メインアプリケーションでCoreDataを使用しようとしましたが、Today Extensionとそれ以降のWatchAppでアクセスしたいと思います。Swift - iOS10 - CoreData - TodayウィジェットのFetchRequestは常に0個の要素を返します

私は今日のウィジェットのために新しいターゲットを追加しました - 両方のターゲットのアクティブなAppGroupsよりも。もちろん、同じappGroup。

私は "SharedCode"フレームワークを構築しました。私のメインと今日のアプリケーションの両方で、ヘルパークラスと私のCoreDataStackクラスを共有する。

私はCoreDataStackは、このブログ投稿で述べ建て:ディレクトリを変更カントーhttps://swifting.io/blog/2016/09/25/25-core-data-in-ios10-nspersistentcontainer/

はまた、私はこのコードを追加:

final class PersistentContainer: NSPersistentContainer { 
    internal override class func defaultDirectoryURL() -> URL { 
     var url = super.defaultDirectoryURL() 
     if let newURL = 
      FileManager.default.containerURL(
       forSecurityApplicationGroupIdentifier: CoreDataServiceConsts.applicationGroupIdentifier) { 
      url = newURL 
     } 
     return url 
    } 
} 

をこれは私のCoreDataStackヘルパークラスである:

struct CoreDataServiceConsts { 
    static let applicationGroupIdentifier = "nnnnnnnnn.group.is.xnd.xyz" 
    static let modelName = "Weight" 
} 

public class CoreDataStack { 

    public static let shared = CoreDataStack() 
    public var errorHandler: (Error) -> Void = {_ in } 

    //#1 
    public lazy var persistentContainer: NSPersistentContainer = { 
     let container = NSPersistentContainer(name: CoreDataServiceConsts.modelName) 
     container.loadPersistentStores(completionHandler: { [weak self](storeDescription, error) in 
      if let error = error { 
       NSLog("CoreData error \(error), \(error._userInfo)") 
       self?.errorHandler(error) 
      } 
     }) 
     return container 
    }() 

    //#2 
    public lazy var viewContext: NSManagedObjectContext = { 
     return self.persistentContainer.viewContext 
    }() 

    //#3 
    // Optional 
    public lazy var backgroundContext: NSManagedObjectContext = { 
     return self.persistentContainer.newBackgroundContext() 
    }() 

    //#4 
    public func performForegroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) { 
     self.viewContext.perform { 
      block(self.viewContext) 
     } 
    } 

    //#5 
    public func performBackgroundTask(_ block: @escaping (NSManagedObjectContext) -> Void) { 
     self.persistentContainer.performBackgroundTask(block) 
    } 

    public func saveContext() { 
     guard viewContext.hasChanges else { return } 

     do { 
      try viewContext.save() 
     } catch let error as NSError { 
      print("Unresolved error \(error), \(error.userInfo)") 
     } 
    } 
} 

そして、私はNSPersistentContainerのサブクラスを構築しました:

final class PersistentContainer: NSPersistentContainer { 

    internal override class func defaultDirectoryURL() -> URL { 
     var url = super.defaultDirectoryURL() 

     if let newURL = FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: CoreDataServiceConsts.applicationGroupIdentifier) { 
      url = newURL 
     } 

     return url 
    } 
} 
私はNSFetchedResultControllerを使用する私のメインアプリケーションで

- Entitysが:)

完全に正常に動作している追加となって今私はCoreDataから読みたい - 私はFetchRequestを使用します。

func fetchWeights() { 

    let fetchRequest: NSFetchRequest<Measure> = Measure.fetchRequest() 
    let dateSort = NSSortDescriptor(key: #keyPath(Measure.date), ascending: false) 
    fetchRequest.sortDescriptors = [dateSort] 
    fetchRequest.returnsObjectsAsFaults = false 

    do { 
     let results = try CoreDataStack.shared.viewContext.fetch(fetchRequest) 
     if results.count > 0 { 
      // There are found Weigts 
      print("weights FOUND: \(results.count)") 
     } else { 
      // Nil Weights found 
      print("NO weights: \(results.count)") 
     } 
    } catch let error as NSError { 
     print("Fetch error: \(error) description: \(error.userInfo)") 
    } 
} 

ませんフェッチ要求常にゼロのオブジェクトを返します。 私のCoreDataにはエンティティがあります - 私のメインアプリケーションには表示されています。

アイデア? 私は間違って何をしているのか分かりません。 助けてくれてありがとう。

+0

これはトリックを行う必要があります 'しましょうfetchRequest = NSFetchRequest (エンティティネーム: "yourEntityName")'、その後、キャスト結果は? [yourEntity] '? – Bastek

+0

何も変わっていません:/ /しかし、とにかく:)助けてくれてありがとう:) – lks

答えて

1

あなたは defaultDirectoryURLを上書きするPersistentContainerサブクラスを定義しているが、あなたのCoreDataStackはまだあなたの怠惰なコンテナのNSPersistentContainerタイプでビルドを使用しています。あなたが変更した場合にフェッチ要求を何

public class CoreDataStack { 

public static let shared = CoreDataStack() 
public var errorHandler: (Error) -> Void = {_ in } 

//#1 
public lazy var persistentContainer: PersistentContainer = { 
    let container = PersistentContainer(name: CoreDataServiceConsts.modelName) 
    container.loadPersistentStores(completionHandler: { [weak self](storeDescription, error) in 
     if let error = error { 
      NSLog("CoreData error \(error), \(error._userInfo)") 
      self?.errorHandler(error) 
     } 
    }) 
    return container 
}() 

乾杯 のMichał

+0

私はそれを結びつけ、まだ0の結果を得る – moonvader

関連する問題