iOS App 에서 데이터 관리 프레임 워 크 Core Data 의 기본 데이터 조작 튜 토리 얼

10805 단어 iOSCoreData
NSEntity Description 은 실체 설명 대상 으로 데이터베이스 에 있 는 표,NSEntity Description 은 표 의 구조 정 보 를 저장 할 수 있 습 니 다.이러한 유형 은 모두 추상 적 인 구조 류 로 실제 모든 데이터 의 정 보 를 저장 하지 않 고 구체 적 인 데 이 터 는 NSManaged Object 류 에 의 해 묘 사 됩 니 다.우 리 는 보통 실 체 를 NSManaged Object 에 계승 합 니 다.
Xocde 도 구 는 빠 른 실체 클래스 화 기능 을 제공 합 니 다.또한 우리 가 처음에 만 든 반 과 학생 실 체 를 보 여 줍 니 다.xcdatamodel 파일 을 클릭 하고 Xcode 도구 위 에 있 는 네 비게 이 션 표시 줄 의 Editor 탭 을 클릭 하여 Create NSManaged Object Subclass 옵션 을 선택 하고 팝 업 창 에서 클래스 화 할 실 체 를 선택 하 십시오.다음 그림:
201662893746411.png (320×266)
201662893807952.png (446×396)
이 때,Xcode 는 자동 으로 파일 을 만 들 것 입 니 다.이 파일 들 에는 각 종류의 속성 에 대한 설명 이 있 습 니 다.
1.데이터 만 들 기
다음 코드 를 사용 하여 데이터 생 성:
     //
    NSURL *modelUrl = [[NSBundle mainBundle]URLForResource:@"Model" withExtension:@"momd"];
    //
    NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl];
    //
    NSPersistentStoreCoordinator * psc = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:mom];
    //
    NSURL * path =[NSURL fileURLWithPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.sqlite"]];
    //
    /*
    :
     NSString * const NSSQLiteStoreType;//sqlite
     NSString * const NSXMLStoreType;//XML
     NSString * const NSBinaryStoreType;//
     NSString * const NSInMemoryStoreType;//
    */
    [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:path options:nil error:nil];
    //
    NSManagedObjectContext * moc = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
    //
    [moc setPersistentStoreCoordinator:psc];
    //
    /*
   
    */
    SchoolClass * modelS = [NSEntityDescription insertNewObjectForEntityForName:@"SchoolClass" inManagedObjectContext:moc];
    //
    modelS.name = @" ";
    modelS.stuNum = @60;
    //
    if ([moc save:nil]) {
        NSLog(@" ");
    }
    NSLog(@"%@",[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.sqlite"]);
인쇄 된 경 로 를 찾 으 면 sqlite 파일 이 하나 더 있 고 그 중 한 장의 표 에 데 이 터 를 추가 한 것 을 발견 할 수 있 습 니 다.
2.조회 데이터
CoreData 에 서 는 조회 요청 을 통 해 데 이 터 를 조회 하고 조회 요청 은 NSFetchRequest 에서 관리 하고 유지 합 니 다.
NSFetchRequest 는 주로 두 가지 측면의 조회 서 비 스 를 제공 합 니 다.
1.범위 조회 관련 기능 제공
2.검색 결과 반환 형식 과 정렬 에 관 한 기능 제공
NSFetchRequest 에서 자주 사용 하 는 방법 은 다음 과 같 습 니 다.//
+ (instancetype)fetchRequestWithEntityName:(NSString*)entityName;
//
@property (nullable, nonatomic, strong) NSPredicate *predicate;
//
@property (nullable, nonatomic, strong) NSArray<NSSortDescriptor *> *sortDescriptors;
//
@property (nonatomic) NSUInteger fetchLimit;
//
/*
typedef NS_OPTIONS(NSUInteger, NSFetchRequestResultType) {
    NSManagedObjectResultType  = 0x00,
    NSManagedObjectIDResultType  = 0x01,
    NSDictionaryResultType          NS_ENUM_AVAILABLE(10_6,3_0) = 0x02,
    NSCountResultType    NS_ENUM_AVAILABLE(10_6,3_0) = 0x04
};
*/
@property (nonatomic) NSFetchRequestResultType resultType;
//
@property (nonatomic) BOOL includesSubentities;
//
@property (nullable, nonatomic, copy) NSArray *propertiesToFetch;
SchoolClass , :
    //
    NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"SchoolClass"];
    // stuNum=60
    [request setPredicate:[NSPredicate predicateWithFormat:@"stuNum == 60"]];
    //
    NSArray * res = [moc executeFetchRequest:request error:nil];
    NSLog(@"%@",[res.firstObject stuNum]);
데이터 초기 화
    NSFetched Results Controller 의 초기 화 는 조회 요청 과 데이터 조작 컨 텍스트 가 필요 합 니 다.코드 예 시 는 다음 과 같다.//
@interface ViewController ()<NSFetchedResultsControllerDelegate>
{
    //
    NSFetchedResultsController * _fecCon;
}
@end
@implementation ViewController - (void)viewDidLoad {
    [super viewDidLoad];
    //
    NSURL *modelUrl = [[NSBundle mainBundle]URLForResource:@"Model" withExtension:@"momd"];
    NSManagedObjectModel * mom = [[NSManagedObjectModel alloc]initWithContentsOfURL:modelUrl];
    NSPersistentStoreCoordinator * psc = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:mom];
    NSURL * path =[NSURL fileURLWithPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject] stringByAppendingPathComponent:@"CoreDataExample.sqlite"]];
    [psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:path options:nil error:nil];
    NSManagedObjectContext * moc = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];
    [moc setPersistentStoreCoordinator:psc];
    NSFetchRequest * request = [NSFetchRequest fetchRequestWithEntityName:@"SchoolClass"];
    //
    [request setSortDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"stuNum" ascending:YES]]];
    //
    _fecCon = [[NSFetchedResultsController alloc]initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:nil cacheName:nil];
    //
    _fecCon.delegate=self;
    //
    [_fecCon performFetch:nil];
}
@end
NSFecthed Results Controller 를 초기 화 하 는 데이터 요청 대상 은 정렬 규칙 을 설정 해 야 합 니 다.initWith FetchRequest:managed Object Context:section NameKeyPath:cacheName:방법 에서 세 번 째 인 자 를 설정 하면 세 번 째 인 자 를 키 값 으로 데이터 의 파 티 션 을 진행 합 니 다.데이터 가 변 할 때 대 리 를 통 해 방법 을 바 꿀 것 입 니 다.
3.UITableView 와 데이터 바 인 딩-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"cellid"];
    if (!cell) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"cellid"];
    }
    //
    SchoolClass * obj = [_fecCon objectAtIndexPath:indexPath];
    cell.textLabel.text = obj.name;
    cell.detailTextLabel.text = [NSString stringWithFormat:@" %@ ",obj.stuNum];
    return cell;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return [_fecCon sections].count;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    id<NSFetchedResultsSectionInfo> info =  [_fecCon sections][section];
    return [info numberOfObjects];
   
}
효 과 는 다음 과 같다.
201662893909721.png (313×583)
4.데이터 변 화 를 보기 에 투사 합 니 다.//
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
{
    // tableView
    [[self tableView] beginUpdates];
}
//
- (void)controller:(NSFetchedResultsController *)controller didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo atIndex:(NSUInteger)sectionIndex forChangeType:(NSFetchedResultsChangeType)type
{
    //
    switch(type) {
        //
        case NSFetchedResultsChangeInsert:
            [[self tableView] insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //
        case NSFetchedResultsChangeDelete:
            [[self tableView] deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //
        case NSFetchedResultsChangeMove:
        //
        case NSFetchedResultsChangeUpdate:
            break;
    }
}
//
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath
{
    switch(type) {
        //
        case NSFetchedResultsChangeInsert:
            [[self tableView] insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //
        case NSFetchedResultsChangeDelete:
            [[self tableView] deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
        //
        case NSFetchedResultsChangeUpdate:
            [self reloadData];
            break;
        //
        case NSFetchedResultsChangeMove:
            [[self tableView] deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
            [[self tableView] insertRowsAtIndexPaths:@[newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
            break;
    }
}
//
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
{
    [[self tableView] endUpdates];
}

좋은 웹페이지 즐겨찾기