NSManagedObject Context

5762 ワード

一、概念
1.ore Dataはデータの持続化メモリの最適な方式です。
2.データの最終記憶タイプは、SQLiteデータベース、XML、バイナリ、メモリ、またはカスタムデータタイプとすることができます。
Mac OS X 10.5 Leopard以降のバージョンでは、開発者はNSPersistentStore類を継承することにより、独自のストレージフォーマットを作成することもできます。
3.メリット:メモリを合理的に管理し、sqlの使用を避けることができ、効率的である
4.構成:
(1)NSManagedObject Contect(管理されているデータコンテキスト)
実際の操作内容(持久層の操作)
作用:データの挿入、クエリデータの削除
(2)NSManagedObject Model(管理されているデータモデル)
データベースのすべてのテーブルまたはデータ構造には、各エンティティの定義情報が含まれています。
作用:エンティティの属性を追加し、属性間の関係を作成します。
操作方法:ビューエディタ、またはコード
(3)NSPersistent Storordinator(恒久化記憶アシスタント)
データベースに相当するコネクタ
役割:データ格納の名前、位置、保存方式、およびタイミングを設定する
(4)NSManagedObject(管理されているデータ記録)
データベース内のテーブルレコードに相当します。
(5)NSFetch Request(データ取得要求)
クエリ文に相当します。
(6)NSEntity Description(エンティティ構造)
テーブル構造に相当する
(7)拡張子は.xcdatamodedのカバンの中にあります。xcdata modelファイル、データモデルエディタで編集します。
コンパイル後は.momdまたは.momファイルです。
5.依存関係http://pic002.cnblogs.com/images/2012/373740/2012100910564755.png
二、SQLiteデータベースに基づく場合、Core Dataの簡単な使用
SQLiteとの違い:エンティティ全体の記録を取り出し、分解して、エンティティのある属性を得ることができます。
contextオブジェクトNSManagedObject Controtextを提供します。ユーザとデータの相互作用を担当するpersistentContiner:メモリ、CoreDを更新します。
 func getContext() -> NSManagedObjectContext  {
        let delegate = UIApplication.shared.delegate as! AppDelegate
        let context = delegate.persistentContainer.viewContext
        return context
    }
CoreDataを継承する
import CoreData
1.エンティティの説明を作成する
//1.2        
       let entityDes = NSEntityDescription.entity(forEntityName: "Student", in: self.getContext())
       //1.1  Student
       let st = NSManagedObject(entity: entityDes!, insertInto: self.getContext())
       //1.3 student   kvc
       st.setValue(10, forKey: "age")
       st.setValue("  ", forKey: "name")
       //1.4    
       try! self.getContext().save()
       print(NSTemporaryDirectory())
       
クエリー
//1.    
     let resquest = NSFetchRequest(entityName: "Student")
      //2.    
       let arr = try! self.getContext().fetch(resquest) as![NSObject]
       //3.    format:  ( >,< =,)
       let predicate = NSPredicate(format: "name = '  '", argumentArray: nil)
       resquest.predicate = predicate
//2.1    

       for item in arr {
           let name = item.value(forKey: "name")
           let age = item.value(forKey: "age")
            try! self.getContext().save()
           
           print("name = \(name) age = \(age)")
           }
//4.  
        let sort = NSSortDescriptor(key: "age", ascending: true)
        resquest.sortDescriptors = [sort]
        //5.  
       resquest.fetchOffset = 1
      resquest.fetchLimit = 2
      //6.  ,  
        item.setValue("  ", forKey: "name")
       //  
        self.getContext().delete(item as! NSManagedObject)


CoreData複数の教師と複数の学生との関係
import UIKit
import CoreData
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //1.2
        let des = NSEntityDescription.entity(forEntityName: "Student", in: self.getContext())
       //1.1
        let student = NSManagedObject(entity: des!, insertInto: self.getContext())
        //1.3
        student.setValue("  ", forKey: "name")
        student.setValue(12, forKey: "idCard")
        
        let student1 = NSManagedObject(entity: des!, insertInto: self.getContext())
       
        student1.setValue("  1", forKey: "name")
        student1.setValue(22, forKey: "idCard")
        //2.2
        let teDes = NSEntityDescription.entity(forEntityName: "Teacher", in: self.getContext())
        //2.1
        let teacher = NSManagedObject(entity: teDes!, insertInto: self.getContext())
        //2.3
       teacher.setValue("  ", forKey: "name")
        teacher.setValue(12, forKey: "age")

        let teacher1 = NSManagedObject(entity: teDes!, insertInto: self.getContext())
        teacher1.setValue("  1", forKey: "name")
        teacher1.setValue(34, forKey: "age")
        //3.1
        var set = Set() //    
        set.insert(student)
        set.insert(student1)
        teacher.setValue(set, forKey: "students")
        
         var stSet = Set() //     
              stSet.insert(teacher)
             stSet.insert(teacher1)
        student.setValue(stSet, forKey: "teachers")
       try! self.getContext().save()
        print(NSTemporaryDirectory())//      
        
        //  teacher      
        let request = NSFetchRequest(entityName:"Teacher")
        //  
        let pre = NSPredicate(format: "name='  '", argumentArray: nil)
        request.predicate = pre
        //    
        let arr = try! self.getContext().fetch(request) as! [NSManagedObject]
        for item in arr {//       
           let set = item.value(forKey: "students") as! Set
            for stu in set {
                
                print("         \(stu.value(forKey: "name"))")
//                item.setValue("  ", forKey: "name")
//                print(item)
            }
        }
    }

    func getContext() ->NSManagedObjectContext{
        let delegate = UIApplication.shared.delegate as! AppDelegate
        let context = delegate.persistentContainer.viewContext
        return context
    }
}