如何在 Swift 中使用来自不同视图控制器的多个核心数据实体

How to use multiple CoreData entities from different viewControllers in Swift

我想将来自两个 viewControllers.

的数据存储到两个 CoreData 实体中

我可以做到这一点,但是来自一个 viewController。通过使用以下代码。

import UIKit
import CoreData
class ViewController: UIViewController {

    override func viewDidLoad()
    {

        let appDelegate = UIApplication.shared.delegate as! AppDelegate

        let context = appDelegate.persistentContainer.viewContext

        let phoneContactRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "PhoneContacts")

        phoneContactRequest.returnsObjectsAsFaults = false

        let emailContactRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "EmailContacts")

        emailContactRequest.returnsObjectsAsFaults = false
        /*
         // Save to database 

         //object one
         let phoneContactsObject = NSEntityDescription.insertNewObject(forEntityName: "PhoneContacts", into: context)

            phoneContactsObject.setValue("John", forKey: "name")
        phoneContactsObject.setValue("8335636532", forKey: "number")

         //object two
        let emailContactObject = NSEntityDescription.insertNewObject(forEntityName: "EmailContacts", into: context)
        emailContactObject.setValue("Peter@gmail.com", forKey: "email")
        emailContactObject.setValue("Peter", forKey: "emailname")
         */


        do{

            // Fetch from PhoneContacts entity
            let phoneContactResults = try context.fetch(phoneContactRequest)

            if phoneContactResults.count > 0
            {
                for phoneContactResult in phoneContactResults as! [NSManagedObject]
                {
                    if let phoneContactName = phoneContactResult.value(forKey: "name")
                    {
                        print(phoneContactName)
                    }
                    if let phoneContactNumber = phoneContactResult.value(forKey: "number")
                    {
                        print(phoneContactNumber)
                    }
                }
            }
            // Fetch from EmailContacts entity
            let emailContactResults = try context.fetch(emailContactRequest)

            if emailContactResults.count > 0
            {
                    for emailContactResult in emailContactResults as! [NSManagedObject]
                    {
                        if let emailContactName = emailContactResult.value(forKey: "emailname")
                        {
                            print(emailContactName)
                        }
                        if let emailContactEmail = emailContactResult.value(forKey: "email")
                        {
                            print(emailContactEmail)
                        }
                    }
                }
        }
        catch
        {            
        }        
    }    
}

正如您在上面的代码中看到的,我有两个 CoreData 实体 PhoneContactsEmailContacts。我可以将数据从单个 viewController 存储到两个实体中。有效。

现在,我想要的是,如何将数据从 viewController 1 存储到实体 1(PhoneContacts) 中,从 viewController 2 存储到实体 2(EmailContacts) 中?

我应该把 managedObjectContext 分享给第二个 viewController 吗?或者接受任何其他更好的解决方案。

我正在使用 Xcode 8.2,Swift 3.0

提前致谢。

为 CoreData 操作创建并使用单例 class。

例如

class CoreDataHelper: NSObject
{
   static let sharedInstance = CoreDataHelper()

   func appDelegate()->AppDelegate
   {
     return UIApplication.sharedApplication().delegate as! AppDelegate
   }

   func managedObjectContext() -> NSManagedObjectContext
   {
     return self.appDelegate().managedObjectContext
   }
   func fetchPhoneContacts() -> [NSManagedObject]
   {
      // write code to fetch contacts from PhoneContacts entity
   }
   func fetchEmailContacts() -> [NSManagedObject]
   {
      // write code to fetch contacts from EmaliContacts entity
   }
}

来自 viewController1

let phoneContatcs = CoreDataHelper.sharedInstance().fetchPhoneContacts()

来自 viewController2

let emailContatcs = CoreDataHelper.sharedInstance().fetchEmailContacts()

注意:我知道问题是针对 Swift3 的。但我写这个答案是为了让我们知道如何去做。

我没有发现在两个不同的 VC 中使用这两个实体有任何问题。

您所要做的就是,在您的另一行中使用以下两行 VC:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

然后你可以使用:

let emailContactRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "EmailContacts")
emailContactRequest.returnsObjectsAsFaults = false

let emailContactObject = NSEntityDescription.insertNewObject(forEntityName: "EmailContacts", into: context)
emailContactObject.setValue("Peter@gmail.com", forKey: "email")
emailContactObject.setValue("Peter", forKey: "emailname")

然后,您可以保存上下文并使用与现在相同的方法来获取刚刚插入到数据库中的第二个对象。

希望我说的有道理。

编辑:

就个人而言,为了简单起见,我更愿意像@raki 所建议的那样创建核心数据管理器单例class。