【问题标题】:Core Data: Binary Data attribute becomes nil when other attribute is changedCore Data:当其他属性改变时,Binary Data 属性变为 nil
【发布时间】:2018-10-01 20:25:04
【问题描述】:

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

  • 字符串类型的名称
  • 二进制数据类型的图像(选中“允许外部存储”)

现在,由于我正在开发,我在初始 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)")
    }
}

谢谢!

【问题讨论】:

标签: ios swift core-data nsfetchedresultscontroller


【解决方案1】:

您可能想尝试以下方法:

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

你需要为一个键设置值来更新它的值,然后你可以保存它。我希望这会有所帮助

【讨论】:

  • 感谢您的建议!我实现了一个还删除了我放在 DataController.shared.viewContext.perform 中的 if/else 条件。现在这种行为似乎消失了......
  • 是否应该始终使用 setValue(),即使我创建了一个新对象?我在创建对象时一直在使用“product.key = value”。
  • 嗯,我不确定,但是当我创建一个新对象时,我也喜欢你。但是当我需要更新一个对象的值时,我会使用 setValue() :)
  • 我现在在任何地方都使用 setValue() 并且一切似乎都按预期工作......
  • 听起来更好用。
猜你喜欢
  • 1970-01-01
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多