2017-02-17 6 views
1

CoreDataエンティティを2つに格納したいviewControllersSwiftの異なる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 
     {    
     }   
    }  
} 

あなたは上記のコードで見ることができるように、私は2つのCoreDataエンティティPhoneContactsEmailContactsを持っています。単一のviewControllerから両方のエンティティにデータを格納することができました。できます。

さて、私が欲しいものを、どのように私はviewController 2からviewController 1とentity2(EmailContacts)からentity1(PhoneContacts)にデータを保存することができますか?

managedObjectContextを2番目のviewControllerに共有する必要がありますか。または、他のより良い解決策が受け入れられます。事前に私はXcodeの8.2を使用してい

、スウィフト3.0

感謝。

+0

MOCを共有したい場合は、あなたは独立したモデルインターフェースを作成することを避けるために、セグの – Mannopson

+1

'MVC'パターンの支持者を使って共有することができます。 ViewController内にCore Dataコードを持ってはいけません。rakiは良いアプローチを提案しています。 – ystack

答えて

2

CoreData操作にシングルトンクラスを作成して使用します。 viewController2

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

noteからviewController1

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

から、例えば

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 
    } 
} 

:私は質問が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

2つの異なるVCでこれらの2つのエンティティを使用しても問題はありません。

あなたがしなければならないのは、あなたの他のVCで次の2行を使用、次のとおりです。

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") 

をそして、あなたはコンテキスト&を保存することができますDBに挿入したばかりの2番目のオブジェクトをフェッチするのと同じ方法を使用してください。

希望しています。

EDIT:@rakiを示唆しているよう

個人的に、私は簡単にするために作成するコアデータマネージャシングルトンクラスを好むだろう。

関連する問題