2014-01-18 107 views
0

所以當我按下按鈕時,我想要做的是對我的sqlite數據庫運行UPDATE查詢。下面是我有和它不工作,我認爲的問題是,我打開數據庫從捆綁,這當然是只讀。現在我已經做了一些研究,並且意識到我應該:按鈕按下時更新sql查詢?

  1. 檢查Documents文件夾中是否存在數據庫。

  2. 如果不存在,請將數據庫從數據包複製到Documents文件夾。

  3. 現在,從Documents文件夾中打開數據庫。

但我不知道該怎麼做?任何幫助將不勝感激。這裏是我有什麼:

- (IBAction)update:(id)sender { 
@try { 
    NSFileManager *fileMgr = [NSFileManager defaultManager]; 
    NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"StayhealthyExercises-1.sqlite"]; 
    BOOL success = [fileMgr fileExistsAtPath:dbPath]; 
    if(!success) 
    { 
     NSLog(@"Cannot locate database file '%@'.", dbPath); 
    } 
    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)) 
    { 
     NSLog(@"An error has occured: %s", sqlite3_errmsg(db)); 

    } 
    const char *sql = "UPDATE strengthexercises SET isFavorite = 'true' WHERE ID = '1'"; 
    sqlite3_stmt *sqlStatement; 
    if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK) 
    { 
     NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(db)); 
    }else{ 
     if (sqlite3_step(sqlStatement) == SQLITE_DONE){ 
      NSLog(@"Success"); 
     } 
    } 
    sqlite3_finalize(sqlStatement); 
} 
@catch (NSException *exception) { 
    NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(db)); 
} 
@finally { 
    sqlite3_close(db); 
} 

} 

一個明確的答案,一個例子會有很大的幫助。提前致謝。

更新#1

現在我有這個,但它仍然沒有作用......

- (NSString *)applicationDocumentsDirectory { 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
return basePath; 
} 

- (IBAction)update:(id)sender { 
@try { 
    NSString *docsPath = [self applicationDocumentsDirectory]; 
    NSString *dbPath = [docsPath stringByAppendingPathComponent:@"StayhealthyExercises-1.sqlite"]; 
    BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:dbPath]; 
    if (!fileExists) { 
     // get the source path to copy from 
     NSString *dbSourcePath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"StayhealthyExercises-1.sqlite"]; 
     // copy db to documents 
     [[NSFileManager defaultManager] copyItemAtPath:dbSourcePath toPath:dbPath error:nil]; 
    } 
    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)) 
    { 
     NSLog(@"An error has occured: %s", sqlite3_errmsg(db)); 
    } 
    const char *sql = "UPDATE strengthexercises SET isFavorite = 'true' WHERE ID = '1'"; 
    sqlite3_stmt *sqlStatement; 
    if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK) 
    { 
     NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(db)); 
    }else{ 
     if (sqlite3_step(sqlStatement) == SQLITE_DONE){ 
      NSLog(@"Success"); 
     } 
    } 
    sqlite3_finalize(sqlStatement); 
} 
@catch (NSException *exception) { 
    NSLog(@"Problem with prepare statement: %s", sqlite3_errmsg(db)); 
} 
@finally { 
    sqlite3_close(db); 
} 

} 

回答

0

寫回到這樣的文件路徑的方法 -

- (NSString *)applicationDocumentsDirectory { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
    return basePath; 
} 

然後檢查db是否存在於文檔路徑 -

NSString *docsPath = [self applicationDocumentsDirectory]; 
NSString *dbDocsPath = [docsPath stringByAppendingPathComponent:@"StayhealthyExercises-1.sqlite"]; 
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:dbDocsPath]; 

使用條件,以確定是否需要DB複製,如果是複製 -

if (!fileExists) { 
    // get the source path to copy from 
    NSString *dbSourcePath = [[NSBundle mainBundle] pathForResource:@"StayhealthyExercises-1" ofType:@"sqlite"]; 
    // copy db to documents 
    [[NSFileManager defaultManager] copyItemAtPath:dbSourcePath toPath:dbDocsPath error:nil]; 
} 

您現在應該有你的數據庫的副本中,你可以讀/寫文件。

+0

我已更新我的問題與我有什麼,但它仍然無法工作,任何線索? –

+0

我縮小了問題的範圍,它甚至不能讀取它... anysuggesstions –

+0

它說,dbSourcePath是一個未聲明的標識符,即時猜測,因爲它在if語句 –