2013-04-29 4 views
0

나는 SQLlite 데이터베이스를 사용하고있는 곳에서 App을 만들었습니다 ... 필요한 경우 NSCaches Directory에서 다음과 같은 방법으로 앱을 시작할 때 복사합니다 : 나는 그들이 옛 앱하지만 기존의 데이터베이스를 통해 새로운 응용 프로그램을 설치합니다 데이터베이스 - 파일에 STH을 변경하고 내 고객을위한 새로운 응용 프로그램 파일을 만들 경우iOS에서 SQLite DB를 덮어 쓰는 법

- (void) copyDatabaseIfNeeded { 

//Using NSFileManager we can perform many file system operations. 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSError *error; 
NSString *dbPath = [self getDBPath]; 
BOOL success = [fileManager fileExistsAtPath:dbPath]; 

if(!success) { 


    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"datenbankSpeed"]; 
    success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error]; 

    if (!success) 
     NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
} 
} 

- (NSString *) getDBPath { 

//Search for standard documents using NSSearchPathForDirectoriesInDomains 
//First Param = Searching the documents directory 
//Second Param = Searching the Users directory and not the System 
//Expand any tildes and identify home directories. 


NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory , NSUserDomainMask, YES); 
NSString *documentsDir = [paths lastObject]; 
return [documentsDir stringByAppendingPathComponent:@"datenbankSpeed"]; 
} 

내 문제는, 아직 사용,이다하는 충돌이 발생합니다!

답변

0

DB 스키마를 변경하는 경우에만 문제가 있다고 가정합니다. sqlite 데이터베이스에 버전 테이블을 만들고 열 schema_version을 추가하고 코드에서 값을 채 웁니다. 이제 SQL 스키마를 변경할 때마다 코드에서 schema_version 번호를 업데이트하십시오. copyDatabaseIfNeeded에서 기존 db 파일이 있는지 확인하고 파일을 열고 schema_version을 읽습니다. 이 버전이 현재 버전과 같으면 괜찮습니다. 그렇지 않으면 스키마를 마이그레이션해야합니다. 또한 데이터를 새로운 스키마로 마이그레이션하려고 할 것입니다.

편집 : 명확히하기 위해 - copyDatabaseIfNeeded에서 다음을 수행합니다

int version = ... // read schema_version from db 
if (version != kCurrentSchemaVersion) 
{ 
    // convert the schema into new version preserving data if required. 
    // this can be a multi-step process. Eg. if user directly upgrades to schema_version 3 
    // after schema_version 1, first you'll convert from 1->2, then 2->3. 
} 

당신은 또한 의견 @Martin에서 언급 한 바와 같이 PRAGMA user_version에서 살펴 봐야 할 수 있습니다.

+1

나는 그 목적으로'PRAGMA user_version'을 사용할 수 있다고 생각합니다. –

+0

정보 주셔서 감사합니다. 사용법을 설명하는 답변을 추가해야합니다. – Mar0ux

+0

네, 훌륭하게 들리지만 정확히 내 사본에서 정확하게 수행하는 방법 데이터베이스 요구 사항! 예를 들려 줄 수 있습니까?! – davidOhara

관련 문제