2011-11-25 71 views
1

我在我的應用程序中創建數據庫,創建Db後,我試圖將數據庫從應用程序包複製到Doc目錄。但是我無法複製它,我得到的錯誤如 操作無法完成。 (可可錯誤260) 下面顯示的是我在用的代碼,請大家幫我解決這個問題在iphone中集成sqlite

dbName="userDetails.db"; 
returnCode=sqlite3_open(dbName,&handler); 
if(returnCode!=SQLITE_OK) 
    NSLog(@"message---%s",sqlite3_errmsg(handler)); 
else 
    NSLog(@"sucess---%d",returnCode); 

NSFileManager *fmgr=[NSFileManager defaultManager]; 
NSError *error; 
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); 
NSString *path=[paths objectAtIndex:0]; 
NSString *docPath=[path stringByAppendingPathComponent:@"userDetails.db"]; 
if(![fmgr fileExistsAtPath:docPath]){ 
    NSString *defaultDBPath=[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"userDetails.db"]; 
    if(![fmgr copyItemAtPath:defaultDBPath toPath:docPath error:&error]) 
     NSLog(@"failure message----%@",[error localizedDescription]); 
} 

回答

1

其實我對你的代碼有點困惑。您是否試圖以編程方式在應用程序包中創建數據庫,然後將其複製到文檔目錄?如果這是你正在做的事情,那麼你需要知道你不能創建或修改應用程序包中的任何內容。您必須在Documents目錄中創建該數據庫。你應該做這樣的事情 -

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 

    NSString * databasePath = [documentsDir stringByAppendingPathComponent:@"XYZ.sqlite"]; 

    // generate databasePath programmatically 
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
    { 

     // your code here 
    } 

但如果你已經在你的應用程序有一個數據庫(而不是動態創建),你只想把它複製到文檔目錄,那麼你應該遵循@Santosh Gurram答案。

0

兩件事情浮現在腦海中:

  1. 試圖登錄路徑名( docPath和defaultDBPath)。他們是否正確?
  2. 您已打開數據庫文件,也許它不會讓您複製,因此。嘗試評論以下行:

    returnCode = sqlite3_open(dbName,& handler);

    如果(RETURNCODE!= SQLITE_OK)

    NSLog(@"message---%s",sqlite3_errmsg(handler)); 
    

    其他

    NSLog(@"sucess---%d",returnCode); 
    
0

考慮利用核心數據,然後使用JSON序列化的文件爲您最初的有效載荷?

1

嘗試下面的代碼,

- (void) copyDatabaseIfNeeded { 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSString *dbPath = [self getDBPath]; 
    BOOL success = [fileManager fileExistsAtPath:dbPath]; 

    if(!success) { 

     NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"xyz.sqlite"]; 
     success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error]; 

     if (!success) 
      NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    } 
} 

    - (NSString *) getDBPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:@"XYZ.sqlite"]; 
} 

添加-(void)CopyDatabaseIfNeeded- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions的appDelegate方法。

0

嗨我有同樣的問題,因爲當我將db.sqlite添加到項目捆綁我忘了檢查添加到項目選項。檢查此:)