2017-02-17 24 views
1

我想將數據存儲到兩個viewControllers中的兩個CoreData實體中。如何在Swift中使用來自不同viewController的多個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("[email protected]", 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 2存儲從viewController 1和實體2(EmailContacts)數據轉換爲使用實體(PhoneContacts)?

我應該將managedObjectContext分享給第二個viewController嗎?或者接受任何其他更好的解決方案。

我使用Xcode 8.2,Swift 3.0

在此先感謝。

+0

如果你想分享你的MOC?您可以使用賽段 – Mannopson

+1

'MVC'模式提倡者避免創建獨立的模型界面。你應該在ViewControllers內部不要有核心數據代碼,raki提出了一個很好的方法。 – ystack

回答

2

爲CoreData操作創建並使用單例類。

例如

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。但是我寫了這個答案給出了一個想法,我們如何做到這一點。

+0

感謝您的想法。但是它報告類型'CoreDataHelper'的值沒有成員'appDelegate'。我嘗試將它們聲明爲'managedObjectContext'方法,即使它報告相同。我該如何解決這個問題? –

+0

你確定你添加了' func appDelegate() - > AppDelegate { return UIApplication.sharedApplication()。delegate as! AppDelegate }' 函數在你的CoreDataHelper中? – raki

+0

是它的一個問題,而將其更改爲swift3。現在可以了。但現在它報告'AppDelegate'沒有成員managedObjectContext。在這行'return self.appDelegate()。managedObjectContext'中,並且這行代碼存在於managedObjectContext方法內部。 –

3

我在兩個不同的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("[email protected]", forKey: "email") 
emailContactObject.setValue("Peter", forKey: "emailname") 

然後,你可以保存上下文&使用您現在使用的相同方法來獲取剛剛在數據庫中插入的第二個對象。

希望我有道理。

編輯:

就個人而言,我寧願創建核心數據管理單例類爲簡單起見@raki已建議。

相關問題