首页 > 解决方案 > Core Data:当其他属性改变时,Binary Data 属性变为 nil

问题描述

我的应用程序有一个核心数据实体(称为产品),它有两个属性:

现在,由于我正在开发,我在初始viewDidLoad时创建了一个默认对象,其中包含名称和图像的硬编码值。创建对象后,我可以传递它并在我的应用程序中使用它而不会出现问题。

但是,如果我将 name 属性更新为新的字符串值,然后重新运行应用程序,图像属性将变为nil(此行为仅在我重新运行应用程序或终止并重新打开它后才会发生)。你知道是什么导致了这种行为吗?

这就是我更改名称值的方式:

DataController.shared.viewContext.perform {

    if mike {
        product.name = "Mike"
    } else {
        product.name = "Bob"
    }
    try? DataController.shared.viewContext.save()
}

我正在使用 DataController 类与持久存储接口:

   class DataController {

    static let shared = DataController(modelName: "my_model")        
    let persistentContainer: NSPersistentContainer
    var viewContext: NSManagedObjectContext {
        return persistentContainer.viewContext
    }
    private init(modelName: String) {
        persistentContainer = NSPersistentContainer(name: modelName)
    }
    func configureContexts() {
        viewContext.automaticallyMergesChangesFromParent = true
        viewContext.mergePolicy = NSMergePolicy.mergeByPropertyStoreTrump
   }
}

我也在用NSFetchedResultsController。这就是我在我的viewDidLoad

fileprivate func setupFetchedResultsController() {
    let fetchRequest:NSFetchRequest<Product> = Product.fetchRequest()
    let sortDescriptor = NSSortDescriptor(key: "salesByVolume", ascending: false)
    fetchRequest.sortDescriptors = [sortDescriptor]
    fetchedResultsController = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext: DataController.shared.viewContext, sectionNameKeyPath: nil, cacheName: "products")
    fetchedResultsController.delegate = self
    do {
        try fetchedResultsController.performFetch()
    } catch {
        fatalError("The request could not be performed: \(error.localizedDescription)")
    }
}

谢谢!

标签: iosswiftcore-datansfetchedresultscontroller

解决方案


您可能想尝试以下方法:

DataController.shared.viewContext.perform {
    product.setValue("Mike", forKey: "name")
    try? DataController.shared.viewContext.save()
}

您需要为键设置值以更新它的值,然后您可以保存它。我希望这有帮助


推荐阅读