2012-01-20 2 views
3

원본 파일이 137KB인데도 Documents 디렉토리에 복사 한 후 크기가 0KB 인 .db 파일에 문제가 있습니다. SQLite Manager에서 복사 한 파일을 열려고했습니다. 열리면 파일 손상에 대해 불평하지 않습니다 ... 단지 하나의 테이블을 포함하지 않습니다.sqlite 파일을 Documents 폴더에 복사 한 후 파일이 비어졌습니다.

내 코드는 파일을 복사합니다 :

- (void) createEditableDatabase 
{ 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSString *writableDB = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:@"yc_ch.db"]; 
    success = [fileManager fileExistsAtPath:writableDB]; 
    if (success) 
    { 
     return; 
    } 
    NSString *defaultPath = [[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"]; 
    error = nil; 
    success = [fileManager copyItemAtPath:defaultPath toPath:writableDB error:&error]; 
    if (!success) 
    { 
     NSAssert1(0, @"Failed to create writable database file:%@", [error localizedDescription]); 
    } 
} 

확인을 파일이 존재하는 경우, 복사되지 않은 경우. 검사는 RootViewController에서 발생합니다.

- (void)viewDidLoad 
{ 
    self.subCountriesArr=[[NSMutableArray alloc]initWithCapacity:1]; 
    NSMutableArray *subCountriesTemp=[[[NSMutableArray alloc]init]autorelease]; 

    DBAccess *dbAccess=[[DBAccess alloc]init]; 
    [dbAccess createEditableDatabase]; //method to copy file 
    subCountriesTemp=[dbAccess getSubCountries]; 

    [dbAccess closeDataBase]; 
    [dbAccess release]; 
} 

그래서 저에게는 이상합니다. 어떤 도움을 주시겠습니까? 미리 감사드립니다.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *writableDB = [documentsDirectory stringByAppendingPathComponent:@"yc_ch.db"]; 

NSFileManager *fileManager = [NSFileManager defaultManager]; 
if (![fileManager fileExistsAtPath:writableDB]) { 
    NSString *databaseFile = [[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"]; 
    [fileManager copyItemAtPath:databaseFile toPath:writableDB error:nil]; 
    NSLog(@"database copied"); 
} 

내가 NSHomeDirectory이 문서 디렉토리에 액세스하는 유효한 방법이라고 생각하지 않습니다 ....

이 경우 확실히 몰라 : 당신이 그것을 시도에 대해 어떻게

답변

0

글쎄,이 문제를 해결했습니다. 내 DBAccess 클래스에서 나는 메서드를 가지고 :

-(void)initializeDataBase 
{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yc_ch.db"]; 

    // NSString *path=[[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"]; 
    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) 
    { 
     // 
    } 
    else 
    { 
     [self dbConnectionError]; 
    } 
} 

init에서 호출되었습니다. - (void) initializeDataBase가 전혀 실행되지 않습니다. 자,이 코드 조각은 :

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yc_ch.db"]; 

NSString *path=[[NSBundle mainBundle] pathForResource:@"yc_ch" ofType:@"db"]; 
if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) 

나는 별도로 모든 방법을 호출합니다. 도움이되었습니다.

1

그것을 해결할 것이지만 그것은 시험 할 가치가있다.

+0

아니요, 도움이되지 않습니다. 나는 아직도 비어있는 db를 얻고있다 – NCFUSN

+0

당신은 그것이 깨끗한 사본이라 확신합니까? 어떻게 든 내 애플 리케이션은 데이터베이스를 캐쉬했다. 심지어 내가 앱을 청소했을 때 ... 내가 다시 인스톨하기 위해서 앱 디렉토리를 수동으로 삭제해야만했다. ... – Ron

+0

나는 그것을했다. iphone 시뮬레이터에서 삭제하려고했는데, 수동으로 다른 시험판을 삭제했다. 아무것도 도움이되지 않습니다. 모든 새로운 신선한 컴파일 날 또 0KB 데이터베이스를 가져온다. – NCFUSN

7

결국 나는 이것을 좋아했다. 그것은 나를 위해 일했다.

1) .db 파일을 클릭하십시오.

2) 다음 오른쪽에있는 fileInspector을 찾아, 파일 관리자

3) 확인란이 선택 여부 .DB 파일의 대상 회원 확인을 클릭합니다.

그것은 작동 희망 확인란을 선택하지 않을 경우

4) ...

+0

고마워요, 저를 구해 주셨습니다 –

+0

하지만 어떻게 이런 일이 실제로 일어날 수 있습니까? .sqlite3 파일이 필요한 라이브러리 폴더에 복사되었지만 DB 스키마가 없으므로! 그리고 그 이유는 그것이 목표 회원이 없었기 때문인 것처럼 보입니다. 그러나 목표 회원이 없다면 주어진 경로로 어떻게 복사 될까요? 실마리를주십시오! 감사합니다. 당신은 많은 시간을 절약 할 수 있습니다! (와이) –

0

나는이 도움이된다면 모르겠지만 당신은 핵심 데이터 '.sqlite'데이터베이스 또한 사본을 복사 할 경우 비어 있지만 두 개의 파일 '.sqlite-shm'과 '.sqlite-wal'이 더 있습니다. 대상의 동일한 확장자를 가진 두 개의 파일을 더 복사하면 데이터베이스는 더 이상 비어 있지 않습니다.

관련 문제