2009-10-28 3 views
12

아이폰 앱을 만들고 코어 데이터가 SQLite 데이터베이스보다 읽기 전용 데이터에 더 적합한 지 궁금해합니다. SQLite DB가 더 나은 선택이라고 생각합니다. 맞습니까? 핵심 데이터 저장소를 미리 채울 수 있습니까?코어 데이터는 읽기 전용 데이터에도 유용합니까?

기본적으로 한 묶음 (최대 3000 개)의 엔티티가있는 3 개의 테이블이 필요합니다. 그런 다음 TableViews에 데이터를 나열하거나 검색하거나 다른 목적으로 데이터를로드하려고합니다.

이 경우 코어 데이터를 사용해야합니까, 아니면 사용할 수 있습니까?

답변

13

읽기 전용 데이터를 테이블 뷰에 표시하려면 SQLite를 통해 Core Data를 사용하는 것이 큰 이점이 될 수 있습니다 NSFetchedResultsController로 인해. 이 편리한 클래스를 사용하면 데이터베이스 요소를 테이블 뷰에 매우 쉽게 표시 할 수 있으며 일괄 페치를 처리 할 수 ​​있습니다. 일괄 가져 오기를 사용하면 필요한 정보 만 화면에 표시 할 수 있으므로 가장 작은 데이터 세트를 제외한 모든 데이터에 대한 로딩 시간과 메모리 사용이 크게 향상됩니다.

나는 사용자의 응용 프로그램 데이터에 저장된 쓰기 가능한 데이터베이스와 데이터 모델을 공유 할 수 있다는 사실과 함께 응용 프로그램 번들에 제공되는 읽기 전용 정보에 코어 데이터를 사용합니다. 내 권장 사항은 iPhone OS 2.x 장치를 대상으로해야하는 경우가 아니면 핵심 데이터로 이동하는 것입니다.

-8

코어 데이터는 SQLite (다른 옵션 중에서)를 사용하므로 약간의 결함이 있습니다.

+4

가 나는 결함이 질문을 고려하지 않을 것입니다. CoreData는 SQLite를 기본 스토리지로 사용하지만 SQLite 자체에 대한 인터페이스는 없습니다. 대신 CoreData의 힘은 클래스와 메소드에서 파생됩니다. 예를 들어,'NSFetchedResultsController'를'UITableView'와 함께 사용하면 필요할 때 디스크에서 효율적으로 데이터를 읽고, 그에 따라 메모리를 관리하는 데 도움이됩니다. 스트레이트 SQLite를 사용한다면 본질적으로 스스로 할 수 있습니다. – jbrennan

+0

코어 데이터를 사용할 때 SQLite API는 어디에 있습니까? 내가 말할 수있는 한, 아직 거기에있다. –

+1

한 번에 두 가지 모두에 액세스 할 수 있는지 여부는 신경 쓰지 않습니다. 핵심 데이터로 개체를 관리 할 때 나쁜 생각 일 수 있습니다. 나는 하나를 사용하고 싶고 어떤 것이 가장 좋은지를 알아야합니다. – Christian

2

은 사전 채워진 SQLite 데이터베이스 나 모든 데이터가 포함 된 큰 plist처럼 미리 채워진 코어 데이터 저장소를 앱에 제공 할 수 있습니다 (단, 이 경우) 또는 무엇이든간에.

코어 데이터는 모두 기본 코코아이기 때문에 훌륭합니다. DB에서 네이티브 개체로의 모든로드를 처리하고 무한 최적화되었습니다. 그러나 수정, 변경 사항 저장, 실행 취소 및 재실행 지원 등 신경 쓰지 않는 코드도 많이 있습니다. 따라서 확실하게 올바른 대답은 아닙니다.

많은 것들이 핵심 데이터와 대안 모두에 대한 귀하의 편안함에 달려 있습니다. 귀하의 데이터를 얻기 위해 SQLite API (또는 다수의 Cocoa wrappers) 중 하나를 다루는 것이 행복합니까? 그렇다면 간단해질 수 있습니다. 핵심 데이터를 보유하고 있다면 ORM을 통해 큰 이익을 얻을 수 있습니다. 반면에 핵심 데이터를 사용하는 복잡한 쿼리는 SQLite로 베어 ​​SQL을 사용하는 것보다 더 복잡한 프리디 케이트 API를 사용합니다. 그런 종류의 것.

+0

테이블 중 하나에 최대 3000 개의 레코드가 될 수 있다는 정보를 추가했습니다. 내가 쉽게 내 것을 결정할 수 있다면, 나는 여기서 물어볼 필요가 없을 것이다. 그러나 큰 단점이 없다는 것을 알고 있으면 도움이됩니다. – Christian

2

관계형에 따라 plist에서 읽기 전용 데이터를 읽는 것이 좋습니다. Plist는로드/저장하기 쉽고 (NSDictionaries로 바뀝니다) 쉽게 편집 할 수 있습니다

+0

아, 그런 생각을하지 못했습니다. 그것들은 관계형이다. 그것은 마치 "수송 수단에 속한 경로에 역이 속한"것과 같습니다. plists에는 적합하지 않습니다. 맞습니까? – Christian

+0

에 따라 다릅니다. 그것은 엄격하게 계층 적이거나 many-to-many 관계입니까? plist는 전 괜찮아요,하지만 후자는 더 어렵습니다. –

+0

예, 다 대 다 관계가 있습니다. 그래서 나는 plists와 함께 가지 않는 것이 좋습니다. 고마워요! – Christian

10

다음은 plists를 사용하여 코어 데이터 저장소를 미리로드하는 간단한 방법입니다.

사전 배열이 포함 된 속성 목록을 만듭니다. 각 사전의 키를 관리 객체의 키와 일치 시키십시오.

alt text http://www.freeimagehosting.net/uploads/b0b1909e81.png

그런 다음,이 방법을 응용 프로그램이 실행 처음 전화 :

:

- (void)loadDataFromPropertyList { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"someFile" ofType:@"plist"]; 
    NSArray *items = [NSArray arrayWithContentsOfFile:path]; 

    NSManagedObjectContext *ctx = self.managedObjectContext; 

    for (NSDictionary *dict in items) { 
     NSManagedObject *m = [NSEntityDescription insertNewObjectForEntityForName:@"TheNameOfYourEntity" inManagedObjectContext:ctx]; 
     [m setValuesForKeysWithDictionary:dict]; 
    } 

    NSError *err = nil; 
    [ctx save:&err]; 

    if (err != nil) { 
     NSLog(@"error saving managed object context: %@", err); 
    } 
} 

전화 loadDataFromPropertyList 처음 application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions의 구현에 다음 코드를 포함하여 응용 프로그램 출시

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
if (![defaults objectForKey:@"firstRun"]) 
{ 
    [defaults setObject:[NSDate date] forKey:@"firstRun"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    [self loadDataFromPropertyList]; 
}