使用 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 中使用 UISearchBar 和 NSFetchedResultsController 在 Core Data 上一次获取多个实体?
在共享的 Swift App 框架中使用 Core Data
如何在 Documents 文件夹中保存 UIImagePicker 中的 UIImage 并获取路径字符串以保存在 Swift 中的 Core Data 中