如何在 Swift 的不同视图控制器中更新同一实体的属性?
Posted
技术标签:
【中文标题】如何在 Swift 的不同视图控制器中更新同一实体的属性?【英文标题】:How can I update an attribute of the same entity in a different view controller in Swift? 【发布时间】:2021-05-19 05:48:13 【问题描述】:我对使用 Core Data 非常陌生,不知道如何解决这个问题。我有两个视图控制器:视图控制器 A 和视图控制器 B。 在顶部我已经初始化:
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
我在 A 中创建了一个let newUser = User(context: self.context)
,然后继续填写:newUser.name = self.label.text
。现在我想在视图控制器 B 中访问相同的用户对象以填写用户输入时的年龄。如何从视图控制器 B 中的核心数据访问相同的实体对象?
现在我将代码从视图控制器 A 复制并粘贴到视图控制器 B 中(例如实例化一个新用户并放入相同的上下文中),如下图所示在视图控制器 C 中(我正在输出两者),我正在成功检索姓名,但不是年龄:
class ViewControllerC: UIViewController
var users: [User]?
let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
func fetchDriverInfo()
//fetch driver's information
do
self.users = try context.fetch(User.fetchRequest())
self.userName.text = self.users?[0].name //works
self.userAge.text = self.users?[0].age //doesn't work
catch
print("Something went wrong")
【问题讨论】:
修改记录后必须保存上下文。你怎么知道受影响的用户是第一个用户?除非您指定排序描述符,否则 Core Data 会无序获取记录。 是的,我已经保存了。我想我的问题是——每次我调用“新用户”时,它是否会创建一个新的用户实体并将其存储到用户数组中?我不知道为什么我假设上下文会指向同一个用户.. 我如何获得同一个用户? 如果您想获取特定用户,您必须将谓词应用于获取请求。 【参考方案1】:可能的问题:
-
有多个
User
实体,您正在保存一个,然后从另一个读取。
您没有正确写入或保存属性。 age
属性可能存在类型不匹配,并且在写入时出错。看起来您正在读取和写入 viewContext 并且没有其他上下文,您不应该需要保存上下文以查看对它的更改(但这是一个很好的做法),但是如果你用另一个上下文写的,它必须被保存。
您在错误的时间提取。该对象可能会在您进行提取后更新,并且存在一些微妙的时间问题。我通常建议使用 FetchedResultsController 甚至只访问和单个 ManagedObject。我不喜欢直接获取核心数据。处理指向 ManagedObjects 的指针可能很困难。它们被删除后您将无法访问它们,并且它们可能会在您不希望它们更新时进行更新。
如果没有看到写入核心数据的代码,很难确切知道问题所在。
【讨论】:
以上是关于如何在 Swift 的不同视图控制器中更新同一实体的属性?的主要内容,如果未能解决你的问题,请参考以下文章