2012-01-20 140 views
3

我有一個.db文件,在複製到Documents目錄後得到0 KB的大小,而原始文件爲137KB時出現問題。我試圖在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]; 
} 

所以,這對我來說是陌生的。請幫忙嗎?先謝謝你。

回答

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

你怎麼樣用這個試試吧:

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

不,它沒有幫助。我仍然是空的db – NCFUSN

+0

你確定它是一個乾淨的副本?我的應用程序以某種方式緩存了數據庫,即使當我清理應用程序時......我不得不手動刪除應用程序目錄以便它再次安裝... – Ron

+0

我做到了。我試圖刪除iPhone模擬器,他們我手動刪除另一個試用版。沒什麼幫助。每一個新的新編輯帶給我另一個0KB數據庫。 – NCFUSN

7

畢竟, 我這樣做,它爲我工作。

1)單擊.db文件。

2)然後找到右邊fileInspector,單擊文件檢查

3)檢查複選框是否被選中與否.db文件的目標成員。

4)如果沒有選中複選框

希望它會工作...

+0

非常感謝,你救了我 –

+0

但是,這真的發生了什麼? 因爲.sqlite3文件已被複制到所需的Library文件夾,但沒有DB Schema!這裏的原因似乎是因爲它沒有目標成員。但是,如果它沒有目標成員,那麼它如何被複制到給定的路徑? 如果你可以請給一個線索! 謝謝!你節省了很多時間! (Y) –

0

我不知道這是否可以幫助,但如果你複製的核心數據「.sqlite」還數據庫副本它空的,但還有兩個文件'.sqlite-shm'和'.sqlite-wal'。 如果您使用各自的擴展名複製具有相同目標名稱的另外兩個文件,數據庫不再爲空。

相關問題