2011-02-09 6 views
1

저장 용 CoreData를 사용하는 iPhone 응용 프로그램이 있습니다.iPhone CoreData 데이터 만 이동

영구 저장소 (sqlite3 데이터베이스)는 데이터로 채워지는 여러 엔터티와 함께 ​​제공됩니다. 이 데이터는 응용 프로그램의 다양한 메뉴 및 옵션을 만드는 데 사용됩니다. 이 데이터를 "애플리케이션 데이터"라고 부르 자.

응용 프로그램에서 사용자 데이터를 저장하는 데 몇 가지 다른 엔터티가 사용됩니다.

스키마가 거의 변경되지 않지만 사용자에게 새로운 옵션을 제공하기 위해 응용 프로그램 데이터를 업데이트해야하는 경우가 있습니다.

많은 Macromedia CSV 파일에서 새 데이터를 가져 와서 내 개발 컴퓨터에서 sqlite3 데이터베이스를 업데이트하는 MacRuby 스크립트가 있지만 기존 배포 된 응용 프로그램을 새 응용 프로그램 데이터로 업데이트하는 가장 좋은 방법은 무엇인지 모르겠습니다. (스키마 변경 없음) 사용자 데이터에 영향을 미치지 않습니다.

아이디어가 있으십니까?

_ 생각을 조금 후 업데이트 _

, 내가 새로운 데이터를 포함하는 웹 서버에서 새 sqlite3를 파일을 다운로드 할 수있는 응용 프로그램을 설정 지향 얻고있다. 받은 응용 프로그램은 업데이트 sqlite3 파일의 데이터를 응용 프로그램의 작업 데이터베이스 파일로 복사하여 응용 프로그램 데이터를 완전히 대체하지만 사용자 데이터는 건드리지 않습니다.

업데이트가 적용되었는지 확인하기위한 메커니즘은 앱이 주기적으로 다운로드 할 단일 데이터베이스 버전 번호가있는 텍스트 파일을 사용할 수 있습니다. 이 번호가 이전 업데이트 (로컬에 저장 됨)의 번호보다 크면 업데이트가 진행되고, 그렇지 않으면 무시됩니다.

+0

안녕하세요, Futureshocked, 대답을 찾으셨습니까? 나는 또한 동일한 문제에 직면하고있다. DefaultValues라는 엔티티가 있습니다.이 엔티티는 다른 엔티티에있는 사용자 데이터를 건드리지 않고 몇 가지 새로운 레코드로 업데이트하려고합니다. 정확히 내가 무엇을해야하는지 모르겠다 ?? –

+0

아직 끝내지는 않았지만 앞으로 수행 할 전략은 새 데이터를 sqlite3 파일에 묶는 것입니다 (별 문제는 아니지만 간단한 json 파일 일 수 있음). iPhone에 다운로드해야합니다. 그 다음에 앱의 자체 데이터베이스에 필요에 따라 데이터를 복사합니다. 희망이 도움이됩니다. 나는 전화에 sqlite3 파일을 다운로드 한 부분을 구현 한 다음 시간이 부족합니다 :-( – futureshocked

답변

0

sqlite3 스토어에 새 항목을 추가하는 것에 대해 이야기하는 경우 응용 프로그램을 시작할 때 그렇게 할 수없는 이유가 무엇입니까? 이 작업을 직접 수행 할 필요는 없지만 삽입해야하는 데이터가 들어있는 속성 목록을 만들어 응용 프로그램을 시작할 때 업데이트를 수행 할 수없는 이유를 알 수 없습니다.

NSString *applicationDataPath = [[NSBundle mainBundle] pathForResource:@"ApplicationData" ofType:@"plist"]; 
NSString *previousVersion = [[NSUserDefaults standardUserDefaults] stringForKey:@"VERSION"]; 

NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 

/* Don't bother processing updates if the version last run is the same as the current version. */ 
if (! [previousVersion isEqualToString:currentVersion]) 
{ 
    NSArray *versionList = [applicationData objectForKey:@"Versions"]; 

    BOOL process = (nil == previousVersion); 
    for (NSDictionary *versionData in versionList) 
    { 
    NSString *version = [versionData objectForKey:@"version"]; 
    if (process) 
    { 
     // Send dictionary for this version update to some method to process it.. 
     [self processUpdate:versionData]; 
    } 

    if (!process && [version isEqualToString:previousVersion]) 
     process = YES; 
    } 
}  

plist에는이 버전에 대해 업데이트해야하는 응용 프로그램의 각 버전과 데이터를 설명하는 사전이 포함되어 있습니다. 아래에있는 plist 예제는 필요한 세부 정보가 부족하므로 아이디어를 얻기위한 스텁 일뿐입니다.

또한 코드가 실제로 작동하는지는 알 수 없습니다. 문제를 올바르게 이해한다고 가정 할 때 동일한 일을 처리해야한다면 어떻게 될지 생각합니다.

데이터를 업데이트 한 후 앱 실행시 사용자 기본값에 저장된 이전 버전을 업데이트하여 한 번만 실행되도록 할 수 있습니다. = ( { 데이터 = { 1 = { 엔티티 = 메뉴

[{ 버전; } } 버전 = "1.1"; } { 데이터 = { 1 = { entity = Menu; }; }; version = "1.2 "; } { 데이터 = { 1 = { 엔티티 = 메뉴; } } 버전 ="1.3 "; } { 데이터 = { 1 = { 엔티티 = 메뉴; } } 버전 = "2.0"; }, { 데이터 = { 1 = { 엔티티 = 메뉴; } } 버전 = "2.5"; } ); }]

+0

감사합니다 마이크, 내 상황이 정확히 일치하지 않습니다. 내 응용 프로그램에서 CoreData에 의해 지속성에 사용되는 sqlite3 데이터베이스가 있습니다 .DB ~ 4MB이며 사용자 데이터를 보유하고있는 테이블과 응용 프로그램 데이터를 보유하고있는 테이블의 두 세트가 들어 있습니다 .DB의 대량은 응용 프로그램 데이터이며, 이것이 새로운 세트로 대체 할 수 있어야합니다 (사용자 데이터에 영향을주지 않고). – futureshocked

관련 문제