swift - 如何计算保存的对象数量
问题描述
我创建了一个联系人列表,将联系人保存在核心数据中。我可以按姓名访问联系人,但想知道如何获取到目前为止我保存的联系人数量。
我认为托管对象上下文将能够提供硬币,因为这是为添加的每个新联系人创建空间的原因,但事实并非如此,或者我可能使用错误。
这是代码:
import UIKit
import CoreData
class ViewController: UIViewController {
let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
@IBOutlet weak var name: UITextField!
@IBOutlet weak var address: UITextField!
@IBOutlet weak var phone: UITextField!
@IBOutlet weak var status: UILabel!
@IBAction func saveContact(_ sender: UIButton) {
let entityDescription = NSEntityDescription.entity(forEntityName: "Contacts", in: managedObjectContext)
let contact = Contacts(entity: entityDescription!, insertInto: managedObjectContext)
contact.name = name.text!
contact.address = address.text!
contact.phone = phone.text!
do {
try managedObjectContext.save()
name.text = ""
address.text = ""
phone.text = ""
status.text = "Contact Saved"
} catch let error {
status.text = error.localizedDescription
}
}
@IBAction func findContact(_ sender: UIButton) {
let entityDescription = NSEntityDescription.entity(forEntityName: "Contacts",
in: managedObjectContext)
let request: NSFetchRequest<Contacts> = Contacts.fetchRequest()
request.entity = entityDescription
let pred = NSPredicate(format: "(name = %@)", name.text!)
request.predicate = pred
do {
var results =
try managedObjectContext.fetch(request as! NSFetchRequest<NSFetchRequestResult>)
if results.count > 0 {
let match = results[0] as! NSManagedObject
name.text = match.value(forKey: "name") as? String
address.text = match.value(forKey: "address") as? String
phone.text = match.value(forKey: "phone") as? String
status.text = "Matches found: \(results.count)"
} else {
status.text = "No Match"
}
} catch let error {
status.text = error.localizedDescription
}
}
解决方案
您可以通过以下方式获取实体的对象数
do {
let request: NSFetchRequest<Contacts> = Contacts.fetchRequest()
let numberOfContacts = try managedObjectContext.count(for: request)
print(numberOfContacts)
} catch { print(error) }
旁注:您的findContact
方法非常麻烦。这是一个改进的版本
@IBAction func findContact(_ sender: UIButton) {
let request: NSFetchRequest<Contacts> = Contacts.fetchRequest()
request.predicate = NSPredicate(format: "name = %@", name.text!)
do {
let results = try managedObjectContext.fetch(request)
if let match = results.first {
name.text = match.name
address.text = match.address
phone.text = match.phone
status.text = "Matches found: \(results.count)"
} else {
status.text = "No Match"
}
} catch {
status.text = error.localizedDescription
}
}
推荐阅读
- postgresql - 容器化数据库文件路径和根目录未知
- asp.net-core - 运行时基于对象属性值的动态 XML 元素名称
- c++ - 如何在 char* 中添加 char*?
- r - 如何合并两个数据集一列将在两列之间?
- airflow - 在 apache 气流 2.0 中可以避免这个警告吗?
- reporting-services - SSRS - 在文本框中连接多个参数值
- windows - 什么可能会使系统挂起到鼠标和键盘无响应的地步
- python - Discord.py ban all members
- python - clickhouse_driver.errors.ServerException: Code: 62.DB::Exception: Syntax error
- c - 为什么 push 指令会改变 rsp 的值?