2011-10-25 2 views
0

이전에 만든 Sqlite 데이터베이스 파일이 iOS 응용 프로그램과 함께 제공됩니다. 내 질문은 거기에 응용 프로그램에서 테이블을 변경할 수 있도록이 데이터를 전화로 작성하는 가장 좋은 방법은 무엇입니까?이전에 만든 Sqlite 데이터베이스를 iOS의 문서에 쓰는 가장 좋은 방법은

필자의 연구에 따르면 전체 .sql 파일을 루프 처리하고 전화 상에 필요한 테이블과 값을 수동으로 삽입/생성해야 할 수도 있습니다.

내부 저장소에 데이터베이스를 쓰고 그 다음부터 조작 할 방법이 없습니까?

답변

3

를 살펴 보자. 일단 열면 원하는 것을 할 수 있습니다.

다음은이 작업을 수행 한 샘플 프로젝트의 일부 샘플 코드입니다. 내 견본에서는 연락처 데이터베이스입니다. 그것이 확실하지 않다면 ensurePrepared가 번들에서 복사하는 방법에 주목하십시오. 라이브러리 경로에 복사하지만 문서 경로에 복사 할 수 있습니다.

- (BOOL)ensureDatabaseOpen: (NSError **)error 
{ 
    // already created db connection 
    if (_contactDb != nil) 
    { 
     return YES; 
    } 

    NSLog(@">> ContactManager::ensureDatabaseOpen");  
    if (![self ensureDatabasePrepared:error]) 
    { 
     return NO; 
    } 

    const char *dbpath = [_dbPath UTF8String]; 
    if (sqlite3_open(dbpath, &_contactDb) != SQLITE_OK && 
     error != nil) 
    { 
     *error = [[[NSError alloc] initWithDomain:@"ContactsManager" code:1000 userInfo:nil] autorelease]; 
     return NO; 
    } 

    NSLog(@"opened"); 

    return YES; 
} 

- (BOOL)ensureDatabasePrepared: (NSError **)error 
{ 
    // already prepared 
    if ((_dbPath != nil) && 
     ([[NSFileManager defaultManager] fileExistsAtPath:_dbPath])) 
    { 
     return YES; 
    } 

    // db in main bundle - cant edit. copy to library if !exist 
    NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"]; 
    NSLog(@"%@", dbTemplatePath); 

    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; 
    _dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"]; 

    NSLog(@"dbPath: %@", _dbPath); 

    // copy db from template to library 
    if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath]) 
    { 
     NSLog(@"db not exists"); 
     NSError *error = nil; 
     if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error]) 
     { 
      return NO; 
     } 

     NSLog(@"copied"); 
    }  

    return YES;  
} 
+0

정말 고마워요! – George

2

(프로젝트에서) 데이터베이스를 번들에 저장하십시오. App Delegate에서 데이터베이스를 Documents 디렉토리로 복사하십시오 (데이터베이스 디렉토리가 문서 디렉토리에없는 경우에만 수행하십시오. 그렇지 않으면 파일을 항상 덮어 씁니다). 코드에서 항상 문서의 디렉토리에서 사본을 참조하십시오.
사본을 작성하는 방법에 대한 코드는 this SO Question을 읽어보십시오.

Voila.

+0

appDelegate 모델 데이터 저장소를 복사하는 것을 조심해야합니다. 응용 프로그램 대리인은 모델이 데이터를 저장하는 방법에 대한 구체적인 지식이 없어야합니다. – bryanmac

+0

애플의 핵심 데이터 템플릿이이를 설정하기 때문에 appDelegate를 제공했습니다. – Walter

2

.sql 파일을 프로젝트의 리소스 폴더에 포함하고 응용 프로그램을 처음 실행할 때 사용자 문서 폴더에 복사합니다 (또는 파일이없는 경우). 이를 위해 NSFileManager를 사용할 수 있습니다.

당신은 프로젝트에 지원 파일에 추가 한 후이 존재하지 않는 경우 템플릿 DB로 파일을 복사 한 다음 열 수 있습니다 Where would you place your SQLite database file in an iPhone app?

+0

링크를 가져 주셔서 감사합니다! – George

관련 문제