iOS 자습서: Core Data 사용 방법 – 데이터 사전 로드 및 가져오기

12045 단어 iosDatacore
이는 지난번'아이OS 튜토리얼:Core Data 데이터 지속성 저장 기초 튜토리얼'의 후속 튜토리얼로 프로그램도 지난번 제작을 통해 완성된 것이다.
다시 한 강좌에서 우리는 하나의 데이터 모델만 만들었다. 그 후에 우리는 이 데이터 모델의 데이터를 사용하여 하나의 표 보기를 만들었다. 우리는 데이터 모델의 타당성을 어떻게 테스트하는지 배웠다. 오늘 우리는 응용이 시작될 때 이미 존재하는 데이터를 우리 프로그램에 불러오거나 인용하는 방법을 보았다.
 
우리가 지난번 강좌에서 배운 것은 SQLite 데이터베이스를 조작해서 데이터를 불러오는 것이다. 당신은 당연히 이런 방법을 계속 사용할 수 있지만 이 강좌에서 가르치는 방법은 더욱 우아하고 합리적이다.
 
다음 강좌에서 NSFetchedResultsController를 사용하여 응용 프로그램의 접근 데이터를 최적화하는 방법을 토론할 것입니다.
지난번에 제대로 된 프로그램이 없다면 여기서 다운로드할 수 있다.
사전 로드/도입 데이터
 
그렇다면 우리는 도대체 어떻게 데이터를 코어 데이터 데이터베이스에 저장합니까?현재 두 가지 비교적 좋은 선택이 있다.
 
앱을 시작할 때 외부 파일에서 데이터를 도입하는 것은 프로그램이 실행될 때 외부 자원, 예를 들어 SQLite 데이터베이스나 XML 파일에서 데이터를 도입하는 것이다.
이미 제작된 SQLite 데이터베이스를 제공한다. 먼저 지난번 강좌에서 말한 것처럼 데이터베이스 모델을 만들고 이 모델에 데이터를 채운다. 데이터를 채우는 방식은utility app를 사용한다. 이utility app는Core Data API를 사용하여 데이터베이스를 채우는 Mac나 iOS app일 수도 있고 데이터베이스를 직접 채우는 프로그램일 수도 있다.일단 데이터베이스가 채워지면, 당신은 이미 존재하는 데이터베이스가 없는 상황에서 이 데이터베이스에 사용되지 않는 기본 데이터베이스를 설정할 수 있습니다.
이 강좌에서 우리는 두 번째 종류를 통해 간단한 utility app를 사용하여 이미 설치된 코어 데이터 데이터베이스를 미리 불러와서 당신의 앱을 사용할 수 있도록 하는 방법을 보여 드리겠습니다.
 
첫걸음
우리가 iOS에서 CoreData를 사용하는 방법의 기초는 우리가 Mac OS X에서 사용하는 것과 일치하며 그들은 같은 모델과 클래스를 사용한다.
이것은 우리가 맥 OS X에 있는 간단한 콘솔 프로그램을 써서 데이터 원본에서 데이터를 도입하고 이 데이터베이스의 데이터베이스를 우리 iOS 프로그램에 가져다 쓸 수 있도록 하는 것이다. 괜찮지?
 
먼저 Xcode를 열고 Mac OSX 클래스의 Application에서 Command Line Tool 템플릿을 사용해 보겠습니다.
 
프로젝트 이름으로'코어 데이터 투어리즘2'를 쓰죠.'코어 데이터'와'Use Automatic Reference Counting'을 사용하세요.
 
 
생성이 완료되면 "CoreDataTutorial2.xcdatamodeld"를 선택하여 삭제합니다.
 
 
다음에 저희가 저번에 완성한 파일 중에
FailedBankCD.xcdatamodeld
FailedBankInfo.h
FailedBankInfo.m
FailedBankDetails.h
FailedBankDetails.m
파일을 복사하거나 새 프로젝트로 직접 드래그합니다.
 
 
"Copy items into destination group's folder(if needed)"가 선택되지 않았는지 확인합니다.
Add to targets 를 선택합니다.
 
 
이메일 선택m, 우리가 코어 데이터 사용을 선택했기 때문에 템플릿을 만드는 방법을 준비했습니다. 이제 iOS 프로그램에 데이터 수를 생성하도록 이 방법을 수정하겠습니다.
  managedObjectModel() 메서드를
NSString *path = [[[NSProcessInfo processInfo] arguments] objectAtIndex:0];
path = [path stringByDeletingPathExtension];

다음으로 바꾸기
NSString *path = @"FailedBankCD";

이것은 이 프로그램을 우리가 삭제한 것이 아니라 FailedBankCD.xdatamodeld 로 가리킬 것이다.
command + r를 누르면 오류가 없는 것을 볼 수 있습니다.
그러나 만약에 이 단계에 앞서 컴파일을 한 적이 있다면 데이터가 맞지 않는 오류가 발생할 것입니다. 지난번 강좌에서 말한 대로 삭제한 후에 다시 컴파일을 실행하면 됩니다.
만약 당신이 아래의 잘못을 보았다면:
NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator
with a nil model'

 
이것은 프로그램이'momd'파일을 다시 찾았기 때문입니다. (이전 버전의Core Data 모델) 그러나 만약에 앱이 이 파일을 사용하지 않는다면 이 오류가 발생할 수 있습니다. 가장 빠른 수정 방법은managedObjectModel()이라는 방법을 아래로 수정하는 것입니다.
 
 NSURL *modelURL = [NSURL fileURLWithPath:[path stringByAppendingPathExtension:@"mom"]];

이제 괜찮을 거예요.
데이터 가져오기
 
이제 진짜 녀석을 움직일 때가 됐어. 정말 우리의 데이터를 불러올 거야.
 
이 예에서 우리는 JSON 파일에서 데이터를 도입해야 한다. 아마도 다른 유형의 파일에서 데이터를 도입하려고 할 것이다. 그러나 원리는 모두 같다.
 
다음은 iOS – Other – Empty 파일을 새로 작성합니다.
 
 
이 파일을 Banks라고 명명하세요.json.
 
 
다음 코드를 입력합니다.
 
[{ "name": "Bank1", "city": "City1", "state": "State1", "zip": 11111, "closeDate": "1/1/11" },
 { "name": "Bank2", "city": "City2", "state": "State2", "zip": 22222, "closeDate": "2/2/12" },
 { "name": "Bank3", "city": "City3", "state": "State3", "zip": 33333, "closeDate": "3/3/13" },
 { "name": "Bank4", "city": "City4", "state": "State4", "zip": 44444, "closeDate": "4/4/14" } ]

이것은 하나의 수조에 네 개의 사전을 포함하는 JSON 파일로 사전마다 몇 개의FailedBankInfo/FailedBankDetails의 물체와 대응하는 속성이 있다.
만약 당신이 JSON 파일이 어떻게 데이터를 조직하는지 잘 모른다면, 이 강좌를 보십시오:this tutorial.
다음에 우리는 응용 프로그램이 컴파일될 때 이 파일을 우리의 제품 디렉터리, 그림을 보고 프로젝트를 선택한 다음에 CoreDataTutorial2 목표를 선택하고 Build Phase 옵션을 선택하고 "Add Build Phase"를 누르고 "Add Copy File"을 선택하며 목표 위치를 "Products Directory"로 선택하고 마지막으로 "Banks. json을 Add Files 부분으로 드래그합니다.
 
 
하나의 응용 프로그램이 시작될 때FailedBank의 데이터 모델과 클래스를 사용하여CoreData 데이터베이스를 초기화한 다음Banks를 사용해야 한다.json 파일의 데이터를 입력합니다.
지금 우리는:
JSON 파일 로드JSON 파일을 Objective C 배열로 분석이 그룹의 데이터를 일일이 열거해서 모든 물체에managed item을 만듭니다.
Core Data에 모두 저장
프로그래밍 시작,main.m 다음 코드를 주 함수에 추가합니다.
 
    NSError* err = nil;
    NSString* dataPath = [[NSBundle mainBundle] pathForResource:@"Banks" ofType:@"json"];
    NSArray* Banks = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath]
                                                     options:kNilOptions
                                                       error:&err];
    NSLog(@"Imported Banks: %@", Banks);

그 다음에 당신의 주함수는 다음과 같이 보일 것입니다.
 
int main(int argc, const char * argv[])
{

    @autoreleasepool {
        // Create the managed object context
        NSManagedObjectContext *context = managedObjectContext();

        // Custom code here...
        // Save the managed object context
        NSError *error = nil;
        if (![context save:&error]) {
            NSLog(@"Error while saving %@", ([error localizedDescription] != nil) ? [error localizedDescription] : @"Unknown Error");
            exit(1);
        }

        NSError* err = nil;
        NSString* dataPath = [[NSBundle mainBundle] pathForResource:@"Banks" ofType:@"json"];
        NSArray* Banks = [NSJSONSerialization JSONObjectWithData:[NSData dataWithContentsOfFile:dataPath]
                                                         options:kNilOptions
                                                           error:&err];
        NSLog(@"Imported Banks: %@", Banks);

    }
    return 0;
}

이것은 내장된 NSJSONserialization API를 사용하여 JSON의 파일 데이터를Core Foundation의 데이터 형식 중구(예를 들어 NSArray, NSDictionary 등)로 간단하게 가져옵니다. 더 많은 것을 알고 싶으면thistutorial을 보십시오.
이 프로그램을 실행하면 다음 출력을 볼 수 있습니다.
 
2012-04-14 22:01:34.995 CoreDataTutorial2[18388:403] Imported Banks: (
        {
        city = City1;
        closeDate = "1/1/11";
        name = Bank1;
        state = State1;
        zip = 11111;
    },
        {
        city = City2;
        closeDate = "2/2/12";
        name = Bank2;
        state = State2;
        zip = 22222;
    },
        {
        city = City3;
        closeDate = "3/3/13";
        name = Bank3;
        state = State3;
        zip = 33333;
    },
        {
        city = City4;
        closeDate = "4/4/14";
        name = Bank4;
        state = State4;
        zip = 44444;
    }
)

현재 우리는 이 데이터를 Objective – C의 물체에 저장할 수 있다. 그러면 지금 우리는 지난번 강좌의 말미처럼 이 데이터를CoreData의 데이터베이스에 입력할 수 있다.
 
우선 머리에 당신이 필요로 하는 파일의 인용문을 추가하십시오.
 
#import "FailedBankInfo.h"
#import "FailedBankDetails.h"

그 다음에 이걸 주함수 코드에 넣으세요.
 
[Banks enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    FailedBankInfo *failedBankInfo = [NSEntityDescription
                                      insertNewObjectForEntityForName:@"FailedBankInfo"
                                      inManagedObjectContext:context];
    failedBankInfo.name = [obj objectForKey:@"name"];
    failedBankInfo.city = [obj objectForKey:@"city"];
    failedBankInfo.state = [obj objectForKey:@"state"];
    FailedBankDetails *failedBankDetails = [NSEntityDescription
                                            insertNewObjectForEntityForName:@"FailedBankDetails"
                                            inManagedObjectContext:context];
    failedBankDetails.closeDate = [NSDate dateWithString:[obj objectForKey:@"closeDate"]];
    failedBankDetails.updateDate = [NSDate date];
    failedBankDetails.zip = [obj objectForKey:@"zip"];
    failedBankDetails.info = failedBankInfo;
    failedBankInfo.details = failedBankDetails;
    NSError *error;
    if (![context save:&error]) {
        NSLog(@"Whoops, couldn't save: %@", [error localizedDescription]);
    }
}];

// Test listing all FailedBankInfos from the store
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"FailedBankInfo"
                                          inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
for (FailedBankInfo *info in fetchedObjects) {
    NSLog(@"Name: %@", info.name);
    FailedBankDetails *details = info.details;
    NSLog(@"Zip: %@", details.zip);
}

이 코드들은 본질적으로 우리가 지난번에 사용한 코드들이다. 우리가 이번에 enumerate Objects Using Block을 사용한 것을 제외하고는 이 그룹의 내용을 일일이 열거한 후에 삽입한 다음에 우리는Fetch 명령을 사용하여 데이터를 출력한다.
지금 실행하면 출력되기 전의 그룹을 볼 수 있습니다.
 
2012-04-14 22:15:44.149 CoreDataTutorial2[18484:403] Name: Bank1
2012-04-14 22:15:44.150 CoreDataTutorial2[18484:403] Zip: 11111
2012-04-14 22:15:44.150 CoreDataTutorial2[18484:403] Name: Bank2
2012-04-14 22:15:44.151 CoreDataTutorial2[18484:403] Zip: 22222
2012-04-14 22:15:44.152 CoreDataTutorial2[18484:403] Name: Bank3
2012-04-14 22:15:44.152 CoreDataTutorial2[18484:403] Zip: 33333
2012-04-14 22:15:44.153 CoreDataTutorial2[18484:403] Name: Bank4
2012-04-14 22:15:44.153 CoreDataTutorial2[18484:403] Zip: 44444

Ok, 이것들이 바로 당신이 Core Data에 있는 데이터입니다.이런 간단한 JSON 파일을 제외하고는 더욱 복잡한 JSON 파일, XML 파일, 심지어 일반적인 표 파일을 사용할 수 있습니다. csv 형식으로 저장하면 인터넷에서 온 pipe일 수도 있고 사용할 수 있는 파일의 종류도 셀 수 없습니다. 저희도 나중에 상세하게 소개하겠습니다.
 
X코드가 병이 났어요?
 
Mac OS X의 명령행 프로그램을 사용하는 데이터베이스를 아이폰 앱으로 옮기는 뇌 이식 수술을 한다.데이터베이스 파일을 가장 쉽게 찾을 수 있는 방법은 오른쪽 키(ctrl+)CoreDataTutorial2.xdatamodeld를 누르고'Show in Finder'를 누르는 것이다.
 
 
새 Finder 창이 열립니다. 이 창에는 다음과 같은 파일이 있습니다.
Banks.json - 이것은 데이터의 원시 파일입니다. 기억하십니까?
CoreDataTutorial2 – 이것은 응용 프로그램 자체입니다.
FailedBankCD.momd(또는.mom) - 컴파일된 코어 데이터 모델입니다.
CoreDataTutorial2.sqlite – 이것이 바로 우리가 찾고 있는 sqlite 데이터베이스 파일입니다. 이것은 프로그램에서 생성된 것이기 때문에Core Data는 통용할 수 있을 것입니다.SQLite 데이터베이스에 있는 뷰어를 직접 찾을 수도 있고, 이것을 다운로드할 수도 있다 
"CoreDataTutorial2.sqlite"가 바로 우리가 필요로 하는 파일임을 확인하십시오. 다음은 이 파일을 이전 강좌의 원본 프로젝트 파일로 복사한 다음 열겠습니다.
 
 
Finder에서 "CoreDataTutorial2.sqlite"파일을 Xcode 프로젝트로 드래그하여 "Copy items into destination group's folder(if needed)"옵션이 선택되지 않았는지 확인합니다.
 
 
마지막으로 "FBCDAppDelegate.m"을 열고 CoreDataTutorial2 방법을 찾으면 persistentStoreCoordinator 이 줄 아래에 다음과 같은 코드를 추가합니다.
if (![[NSFileManager defaultManager] fileExistsAtPath:[storeURL path]]) {
    NSURL *preloadURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"CoreDataTutorial2" ofType:@"sqlite"]];
    NSError* err = nil;

    if (![[NSFileManager defaultManager] copyItemAtURL:preloadURL toURL:storeURL error:&err]) {
        NSLog(@"Oops, could copy preloaded data");
    }
}

이 부분의 코드는 sqlite 데이터베이스가 이 앱에 이미 존재하는지 확인하기 위해서입니다. 존재하지 않으면 저희가 미리 불러온 데이터베이스를 찾을 수 있습니다. 그리고 이 데이터베이스를 정상적인 경로로 복제합니다. 아주 간단합니다. 자, 한번 해 봅시다!
 
 
 
JSON 파일에 있던 네 개의 뱅크를 보았고 그 다음에 우리가 첫 번째 강좌에 가입한 Test Bank가 하나 더 있었다. 만약에 보지 못했다면 8할은 데이터베이스에 이미 존재했고 동백시뮬레이터에 있는 앱이 다시 실행되었다.
 
그다음에 뭘 볼까요?
 
이것은 내가 제작한 예시 프로그램 원본입니다. 다운로드를 환영합니다.
이것은 원작자의 템플릿 프로그램입니다:here (direct download)

좋은 웹페이지 즐겨찾기