2012-11-29 2 views
2

현재 프로덕션 환경에서 사용중인 앱이 있습니다. 이 앱의 핵심 데이터 모델의 다음 버전을 크게 변경했습니다.생산 응용 프로그램에서 iOS 핵심 데이터 개체 모델 변경

이전 데이터 모델에서 새로운 데이터 모델로의 변환 작업을 피하기 위해 새 개체 모델과 데이터베이스의 이름을 변경하여 새로운 버전의 응용 프로그램이 이전 데이터베이스를 더 이상 참조하지 않게했습니다. 이전 데이터베이스 데이터가 작고 필요하지 않으므로 문제가 아님).

그러나 이전 데이터베이스에서 필요로하는 데이터가 하나 있습니다. 사용자가 수동으로 새 데이터베이스에 다시 입력해야 할 필요가 있습니다.

내 질문 : 이 데이터를 새 데이터베이스로 가져 오는 나의 옵션에는 어떤 것이 있습니까?

sqlite 데이터베이스에 대해 쿼리를 실행하고 새 데이터베이스를 입력 할 수 있습니까? 또는 데이터를 가져 오기 위해 전체 영구 저장소 & 개체 모델을 만들어야합니까?

아니면 모두 함께 누락 되었습니까?

답변

0

위의 두 가지 제안에 감사드립니다.

단계 : 기존 SQLite는 데이터베이스에 연결하는

  • 시도 나는 내 문제를 해결하기 위해 다음과 같은 사용하여 끝났다.
  • 연결에 성공하면 레코드를 읽습니다.
  • 관리되는 개체 컨텍스트에서 새 관리되는 개체를 만듭니다.
  • 관리 객체의 값을 SQL 결과의 값으로 채 웁니다.
  • 관리되는 개체를 유지하십시오.
  • 이전 데이터베이스를 삭제하십시오.
 
NSString *dbFilePath = [[self applicationDocumentsDirectoryString] stringByAppendingPathComponent:@"RPS.sqlite"]; 

sqlite3 *database; 

if (sqlite3_open([dbFilePath UTF8String], &database)) { 
    NSLog(@"sqlite3_open: failed"); 
} else { 
    NSString *nsquery = [[NSString alloc] initWithFormat:@"SELECT * FROM ztable"]; 
    const char *query = [nsquery UTF8String]; 

    sqlite3_stmt *statement; 
    int prepareCode = (sqlite3_prepare_v2(database, query, -1, &statement, NULL)); 
    if(prepareCode == SQLITE_OK) { 
     MyTable *myTableRecord; 
     NSLog(@"About to start adding the data"); 
     while (sqlite3_step(statement) == SQLITE_ROW) 
     { 
      NSLog(@"***************** row returned ******************"); 

      myObject = [NSEntityDescription insertNewObjectForEntityForName:@"myTable" inManagedObjectContext:self.managedObjectContext]; 

      [myTable setValue:[NSString stringWithFormat:@"%s",(char *)sqlite3_column_text(statement, 7)] forKey:@"field1"]; 
      [myTable setValue:[NSString stringWithFormat:@"%s",(char *)sqlite3_column_text(statement, 8)] forKey:@"field2"]; 

      [self saveContext]; 

     } 

     sqlite3_finalize(statement); 
     NSLog(@"Added sqlite3 data"); 
    } else { 
     NSLog(@"Prepare code was not right: %d",prepareCode); 
    } 

    NSError *err; 
    NSFileManager *filemgr = [[NSFileManager alloc] init]; 
    [filemgr removeItemAtPath:dbFilePath error:&err]; 
    NSLog(@"Deleted old sqlite3 database"); 
} 
+0

이것은 멋진 솔루션입니다. 모델 변경이 심각했기 때문에 현재 위치에서 CoreData 마이그레이션을 시도하지 않았다고 가정합니다. 확실히, "단순한"모델 변경을 위해, 자동 마이그레이션은 갈 길입니다 ... –

+0

정확히 .. 자동 마이그레이션은 내가 만든 모든 관계 변화 등을 다루지 않았습니다. 이것은 조금 해키가 될 수 있습니다 ..하지만 그것은 간단합니다 :). – mtb

+0

간단한 작업. :-) 자동 마이그레이션이 아닌 "실제"마이그레이션을 작성하고 숨겨진 모든 항목 (예 : SQLite 데이터베이스)을 숨겨 놓을 수있는 방법이 있습니다. 그러나 그것은 옳은 "진짜"일이 될 수 있습니다. :-) –

1

사용자가 업데이트 된 앱을 처음 실행할 때 새 데이터베이스로 데이터를 복사해야하는 것처럼 보입니다. 그 시점에서 당신은 오래된 것을 지워 버릴 수 있으므로 아무 것도 쓸 수없는 공간을 차지합니다. 보다 정교한 솔루션이 더 필요할지 확실하지 않습니다. 적절하다고 생각됩니다.

+0

나는 최선/가장 간단한 방법으로 궁금해하고 있습니다. 차라리 2 개의 객체 모델을 가지고 있지 않을 것입니다.이 한 번의 작업 만하면됩니다. – mtb

1

동의합니다. 이전 데이터베이스에 연결하고 데이터를 가져 와서 새 데이터베이스로 이동하는 데 핵심 데이터를 사용해야한다고 생각합니다.

- (NSURL *)urlForDocumentsDirectoryWithFile:(NSString *)fileName { 
    NSURL *docPath = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
    return [docPath URLByAppendingPathComponent:fileName]; 
} 

- (void)deleteFileFromDocumentsIfExists:(NSString *)fileName { 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSURL *filePath = [self urlForDocumentsDirectoryWithFile:fileName]; 
    NSLog(@"Deleting file: %@", filePath.absoluteString); 
    if ([fileManager fileExistsAtPath:[filePath path]]) 
    { 
     BOOL success = [fileManager removeItemAtURL:filePath error:&error]; 
     if (!success) NSLog(@"Error: %@", [error localizedDescription]); 
    } 
} 

삭제 코드 :

[self deleteFileFromDocumentsIfExists:@"MyOldDatabaseName.sqlite"]; 

작업을 완료 한 후,이 같은 뭔가 이전 데이터베이스 파일을 삭제해야합니다 (난 당신이 SQLite는에 핵심 데이터 결과를 저장하고 있으리라 믿고있어 참고) 이전 모델을 한 번만 사용한다면 두 가지 모델을 사용하는 것에 대해 걱정하지 않아도됩니다. 앱에서 "한 번 사용 된"코드를 사용하는 것이 낭비되는 곳을 알 수 있지만 핵심 데이터를 건너 뛰고 수동으로 쿼리하는 경우에도이 기능이 필요합니다.

또한 DataAccessManager 유닛을 사용하여 핵심 데이터의 어리석은 초기화 코드를 모두 덤프하여 다중 컨텍스트에 쉽게 액세스 할 수 있도록합니다. 걱정할 필요가있는 모든 작업을 수동으로 작성하려는 경우 그것을 공유 할 수있는 단위로 이동합니다.

관련 문제