使用 Swift 从 Core Data 中获取数据并在 UITextFields 中显示

Posted

技术标签:

【中文标题】使用 Swift 从 Core Data 中获取数据并在 UITextFields 中显示【英文标题】:Fetch data from Core Data and display in UITextFields using Swift 【发布时间】:2019-02-10 13:01:00 【问题描述】:

我正在尝试从 Core Data 获取数据并使用 Swift 在 UITextFields 中显示它们。我想我已经使用以下代码成功保存到 Core Data 中:

    func insertUserData() 

    let user = UserData(context: managedObjectContext)
    user.full_name = nameTextField.text!
    user.address = addressTextField.text!
    user.phone_number = phoneTextField.text!
    user.email = emailTextField.text!

    do 
    try managedObjectContext.save()
        print("Saved Successfully!")
     catch 
        print(error.localizedDescription)
    


其中 UserData 是 Core Data 模型中的实体名称,managedObjectContext 是:

let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

现在我正在尝试使用此代码在另一个 ViewController 中的 UITextFields 中显示保存的数据:

    func loadProfileData() 

    let entityDescription = NSEntityDescription.entity(forEntityName: "UserData", in: managedObjectContext)
    let request: NSFetchRequest<UserData> = UserData.fetchRequest()
    request.entity = entityDescription

    do 
        let userInfo = try managedObjectContext.fetch(request as! NSFetchRequest<NSFetchRequestResult>)
        let userInformation = userInfo as! NSManagedObject // I'm getting crash here: Cast from '[Any]' to unrelated type 'NSManagedObject' always fails
        nameField.text = userInformation.value(forKey: "name") as? String
        addressField.text = userInformation.value(forKey: "address") as? String
        phoneField.text = userInformation.value(forKey: "phone_number") as? String
        emailField.text = userInformation.value(forKey: "email") as? String
     catch 
        print(error.localizedDescription)
    


崩溃报告:

    libsystem_kernel.dylib`__pthread_kill:
    0x2105a70fc <+0>:  mov    x16, #0x148
    0x2105a7100 <+4>:  svc    #0x80
->  0x2105a7104 <+8>:  b.lo   0x180a6b11c               ; <+32>
    0x2105a7108 <+12>: stp    x29, x30, [sp, #-0x10]!
    0x2105a710c <+16>: mov    x29, sp
    0x2105a7110 <+20>: bl     0x180a607d4               ; cerror_nocancel
    0x2105a7114 <+24>: mov    sp, x29
    0x2105a7118 <+28>: ldp    x29, x30, [sp], #0x10
    0x2105a711c <+32>: ret 

有什么建议可以解决这个问题吗?还有其他更好的方法吗? 感谢您的时间和努力。非常感谢带有代码示例的答案。

【问题讨论】:

【参考方案1】:
let userInfo = try managedObjectContext.fetch(request as! NSFetchRequest<NSFetchRequestResult>)

或更简单地说:

let userInfo = try managedObjectContext.fetch(request)

因为您已经将request 定义为

let request: NSFetchRequest<UserData> = UserData.fetchRequest()

userInfo 总是作为UserData 的数组返回,因为请求可能返回多个对象(或没有)。您应该测试该数组至少包含一个条目并使用userInfo.first 或最能满足您需求的任何内容。显然,您可以使用NSPredicate 来根据您的选择过滤退货。

【讨论】:

感谢您的回答,但您可以将其添加为评论而不是答案,因为您只建议了代码更改,而不是解决方案! NSPredicate 不是必需的,我也没有问过。还是谢谢你。 我承认代码更改完全是偶然的,但我的回答确实包含解决方案。您将 userInfo 视为单个 UserData 实例,但事实并非如此。这是一个UserData 的数组,您需要从该数组中提取您的值。我没有提供代码,因为我假设您熟悉使用数组。我提到 NSPredicate 是因为您的问题不清楚您是否完全期望该数组仅包含一个元素。如果您需要单个元素,则可以使用适当的谓词将结果过滤为一个。

以上是关于使用 Swift 从 Core Data 中获取数据并在 UITextFields 中显示的主要内容,如果未能解决你的问题,请参考以下文章

(iOS Swift) 从 Core Data 获取记录返回致命错误或 nil

如何使用 Swift 在 Core Data 中组合属性?

如何在 Swift 中使用 UISearchBar 和 NSFetchedResultsController 在 Core Data 上一次获取多个实体?

在共享的 Swift App 框架中使用 Core Data

如何在 Documents 文件夹中保存 UIImagePicker 中的 UIImage 并获取路径字符串以保存在 Swift 中的 Core Data 中

如何使用swift 3仅获取Core Data中的一列数据