2011-03-24 81 views
0

當我運行我的應用程序時,無法執行數據庫操作。當我檢查iphone模擬器的文件目錄時,它不包含數據庫文件。這裏是我的代碼數據庫文件未複製到文檔目錄中

-(id)init 
{ 
    [super init]; 

    [email protected]"DSMDatabase.sqlite"; 

    NSArray * documentsPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 

    NSString * documentDir=[documentsPaths objectAtIndex:0]; 

    databasePath=[documentDir stringByAppendingPathComponent:databaseName]; 

    return self; 
} 

-(void)checkAndCopyDB 
{ 
    BOOL success; 

    NSFileManager * fileManager=[NSFileManager defaultManager]; 

    success=[fileManager fileExistsAtPath:databasePath]; 

    if(success) return; 

    NSString * databasepathfromapp=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; 

    [fileManager copyItemAtPath:databasepathfromapp toPath:databasePath error:nil]; 

    [fileManager release]; 

} 

回答

1

-init你到databasePath分配一個自動釋放價值。根據-checkAndCopyDB的調用方式,databasePath已被釋放,並且該變量現在指向完全不同的東西。

您可以通過在init中保留databasePath來解決此問題,但實際上沒有理由將其保留在單獨的方法中。我想移動databasePath - 相關代碼init分解成checkAndCopyDB,這將很好的工作,避免自動釋放的問題。

+0

所以你的意思是說,我有所有的代碼由init到checkAndCopy方法轉移,所以會有保留databasePath的問題。是嗎?無論如何謝謝 – iOSAppDev 2011-03-24 17:02:51

+0

除了調用[super init]和「return self」之外的所有代碼都可以移入checkAndCopyDB。那麼在那個方法中就不會有任何記憶問題。如果您在此方法之外的任何地方使用「databasePath」,則可能仍需要保留它。 – 2011-03-24 20:00:31

相關問題