iOS App 에서 데이터 관리 프레임 워 크 Core Data 의 기본 데이터 조작 튜 토리 얼
Xocde 도 구 는 빠 른 실체 클래스 화 기능 을 제공 합 니 다.또한 우리 가 처음에 만 든 반 과 학생 실 체 를 보 여 줍 니 다.xcdatamodel 파일 을 클릭 하고 Xcode 도구 위 에 있 는 네 비게 이 션 표시 줄 의 Editor 탭 을 클릭 하여 Create NSManaged Object Subclass 옵션 을 선택 하고 팝 업 창 에서 클래스 화 할 실 체 를 선택 하 십시오.다음 그림:
이 때,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];
}
효 과 는 다음 과 같다.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];
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
View의 레이아웃 방법을 AutoLayout에서 따뜻한 손 계산으로 하면 성능이 9.26배로 된 이야기이 기사는 의 15 일째 기사입니다. 어제는 에서 이었습니다. 손 계산을 권하는 의도는 없고, 특수한 상황하에서 계측한 내용입니다 화면 높이의 10 배 정도의 contentView가있는 UIScrollView 레이아...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.