CloudKit Quick Start - Fetching Records CloudKit


Fetching Records

데이터베이스에 레코드를 저장한 후 다른 메커니즘을 사용해 이들을 얻을 수 있다. 레코드 아이디를 통해 각 레코드를 얻거나 프리디케이트를 통해 많은 레코드를 쿼리한다. (프리디케이트는 레코드를 검색하기 위한 논리적 조건을 정의한다) 전형적으로, 시작시 사용자에게 레코드의 일부를 보여주고 관심있는 사용자에게 변화에 대한 구독한다.

만약 위치 필드형식을 사용하면 you can also fetch records within a geographical region, as described in Fetch Records by Location.

아이디를 통한 레코드 페치

만약 레코드에 대한 아이디를 알고 있으면 각 레코드 아이디를 통해 페치할 수 있다. 예를 들어, 이 코드 조각은 레코드 이름 115를 얻는다

CKDatabase* publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
CKRecordID* artworkRecordID = [[CKRecordID alloc] initWithRecordName:@"115"];
[publicDatabase fetchRecordWithID:artworkRecordID completionHandler:^(CKRecord* artworkRecord, NSError* error) {
  if (error) {
    // error handling for failed fetch from public database
  }
  else {
    // display the fetched record
  }
}];

레코드 얻고 수정하기

각 레코드에 페치하고 수정하고 저장할 수 있다. 이 코드 조각은 Artwork 레코드를 페치하고 날짜 필드값을 변경하고 데이터베이스에 저장한다.

// Fetch the record from the database
CKDatabase* publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
CKRecordID* artworkRecordID = [[CKRecordID alloc] initWithRecordName:@"115"];
[publicDatabase fetchRecordWithID:artworkRecordID completionHandler:^(CKRecord* artworkRecord, NSError* error) {
  if (error) {
    // error handling for failed fetch from public database
  }
  else {
    // modify the record and save it to the database
    NSDate* date = artworkRecord[@"date"];
    artworkRecord[@"date"] = [date dateByAddingTimeInterval:30.0*60.0];
    [publicDatabase saveRecord:artworkRecord completionHandler:^(CKRecord* savedRecord, NSError* saveError) {
      // error handling for failed save to public database
    }];
  }
}];

프리디케이트를 사용해 레코드 쿼리하기

만약 iCloud 에 많은 레코드를 가지고 큰 파일을 저장한다면 장치에 모든 레코드를 저장하는 것은 적절하지 않을 것이다. 대신 쿼리를 사용해 데이터의 일부만 패치해야 한다. 쿼리는 레코드 형식, 프리디케이트, 그리고 인덱스퇸 프리디케이트 필드를 포함하는 프리디케이트인 소트 디스크립터를 결합한다. CKQuery객체를 사용해 코드에서 쿼리를 생성한다

예를들어, 이 코드 조각은 지정된 타이틀로 모든 아트워크를 페치한다.
CKDatabase* publicDatabase = [[CKContainer defaultContainer] publicCloudDatabase];
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"title = %@", @"Santa Cruz Mountains"];
CKQuery* query = [[CKQuery alloc] initWithRecordType:@"Artwork" predicate:predicate];
[publicDatabase performQuery:query inZoneWithID:nil completionHandler:^(NSArray* results, NSError* error) {
  if (error) {
    // error handling for failed fetch from public database
  }
  else {
    // display the fetched records
  }
}];

갤러리 앱에서 아트워크와 지정된 타이틀이 페치되었다.

../Art/5_fetching_by_attribute_2x.png

리캡

이 챕터에서 다음을 학습했다
- 아이디에 의한 레코드 얻기
- 특정 레코드 페치, 수정, 그리고 저장
- 쿼리와 프리디케이트를 사용한 다중 레코드 페치





덧글

댓글 입력 영역