iOS CoreData

joker_king發表於2018-12-19

CoreData核心物件

  • 實體管理類:NSManagedObject
  • 實體描述類:NSEntityDescription
  • 資料管理器類:NSManagedObjectContext
  • 資料聯結器類:NSPersistentStoreCoordinator
  • 資料模型器類:NSManagedObjectModel

CoreData核心類的關係

CoreData核心類的關係

CoreData資料框架的核心物件

持久化儲存和儲存檔案

  • NSPersistentStore:持久化資料儲存,是對實際檔案的一種Objective-C的一種表示方式,一個被封裝好的底層類,用於儲存資料。

被管理上下文

  • NSManagedObjectContext被管理物件上下文,在CoreData中用於操作和使用資料,負責應用和資料庫之間的互動。
  • 資料庫的儲存需要NSManagedObjectContext進行save操作。
  • 資料的查詢需要NSManagedObjectContext進行executeFetchRequest操作,返回值是陣列。
  • CoreData提供的是物件關係對映,NSManagedObjectContext操作的都是NSManagedObject物件。

被管理物件相關類

  • NSManagedObjectMode:被管理物件模型,管理多個物件。
  • NSManagedObject:被管理物件,CoreData返回的資料模型,被管理的物件是根據實體描述生成的。
  • NSEntityDescription:實體描述類根據實體建立被管理物件。
  • Entity:實體類,實體是對檔案資料的描述,被管理物件標表示實體,實體包含名稱,屬性(欄位)和關係,實體的名稱通常被管理物件名稱一致。

資料查詢

  • NSFetchRequest:查詢請求,可以做排序操作,也可以使用謂詞。
  • NSManagedObjectContext:根據NSFetchRequest查詢資料,以陣列形式返回,陣列中包含被管理物件(NSManagedObject)。
  • NSSortDescriptor:排序操作。

資料持久化的過程

  • 持久化資料的過程:context上下文將對被管理物件的子類進行的所有操作(包括增加,刪除,更新等)進行持久化的時候(呼叫save方法的時候),將所有的操作交給持久化資料協調器(persistentStoreCoordinator),persistentStoreCoordinator(持久化資料協調器)會把物件型別的資料轉化成二進位制型別的資料,然後儲存到檔案系統中。
  • 讀取過程:持久化資料協調器(persistentStoreCoordinator)從檔案系統中讀取出二進位制的資料,根據實體物件轉換成對應的物件型別。將轉換好的資料交給上下文來操作。

示例程式碼

往資料庫中新增元素

- (void)addObject{
    NSEntityDescription *description = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:self.delegate.managedObjectContext];
    Student *stu = [[Student alloc]initWithEntity:description insertIntoManagedObjectContext:self.delegate.managedObjectContext];
    stu.name = @"小明";
    stu.gender = @"男";
    [self.delegate saveContext];
    NSLog(@"%@",NSHomeDirectory());
}
複製程式碼

修改元素

- (void)changeFromCoreData{
    NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:@"Student"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",@"小明"];
    request.predicate = predicate;
    NSArray *array = [self.delegate.managedObjectContext executeFetchRequest:request error:nil];
    for (Student *stu in array) {
        stu.name = @"小李";
    }
    [self.delegate saveContext];
}
複製程式碼

刪除元素

- (void)delegateFromCoreData{
    NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:@"Student"];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",@"小明"];
    request.predicate = predicate;
    NSArray *array = [self.delegate.managedObjectContext executeFetchRequest:request error:nil];
    for (Student *stu in array) {
        [self.delegate.managedObjectContext deleteObject:stu];
    }
    [self.delegate saveContext];
}
複製程式碼

查詢元素

- (void)selectFromCoreData{
    NSFetchRequest *request = [[NSFetchRequest alloc]initWithEntityName:@"Student"];
    NSArray *array = [self.delegate.managedObjectContext executeFetchRequest:request error:nil];
    NSLog(@"%@",array);
}
複製程式碼

相關文章