2014-06-30 279 views
1

我插入數據到sqlite數據庫,我已經看到我的控制檯結果NSLog(@「完成」),但我沒有看到我的sqlite數據庫文件中的數據更新。請幫助我 !!!插入數據到sqlite數據庫

這裏我的代碼來保存數據:

- (void)saveData:(NSString *)_Id 
{ 
    sqlite3_stmt *statement; 
    NSString *_databasePath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"data.db"]; 

    const char *dbpath = [_databasePath UTF8String]; 

    if (sqlite3_open(dbpath, &db) == SQLITE_OK) 
    { 

     NSString *insertSQL = [NSString stringWithFormat: 
           @"INSERT INTO MyTable (id) VALUES (\"%@\")", _Id]; 

     const char *insert_stmt = [insertSQL UTF8String]; 
     sqlite3_prepare_v2(db, insert_stmt, 
          -1, &statement, NULL); 
     if (sqlite3_step(statement) == SQLITE_DONE) 
     { 
      NSLog(@"DONE"); 
     } else { 
      NSLog(@"Failed to add contact"); 
     } 
     sqlite3_finalize(statement); 
     sqlite3_close(db); 
    } 
} 
+0

是的,回去並確保你檢查所有的錯誤代碼。並且要明白,100個症狀中有99個是由於SQL文件不在您認爲的位置所致。 –

+0

(使用命令行中的sqlite3來檢查您的數據庫。) –

+0

@KhoaNN您看到「完成」但未看到結果的原因可能是因爲該軟件包是隻讀的。您必須將數據庫複製到Documents文件夾(如果尚未存在),然後使用該數據庫。 – Rob

回答

1

你在你的包打開數據庫。該軟件包在設備上是隻讀的。您必須將數據庫複製到您的Documents文件夾(如果它不存在那裏)並從那裏打開它。

另請注意,您正在處理數據庫的多個副本(項目中的一個,捆綁中的一個,現在位於設備/模擬器的Documents文件夾中)。確保您檢查在正確的數據庫插入的記錄(一個在Documents

順便說一句,你也應該檢查,看看sqlite3_prepare_v2返回SQLITE_OK,如果沒有,請登錄sqlite3_errmsg

您還應該使用使用sqlite3_bind_text在SQL ?佔位符和綁定值(或者,如果它是可能nilsqlite_bind_null):

- (void)saveData:(NSString *)_Id 
{ 
    sqlite3_stmt *statement; 
    NSString *bundlePath = [[[NSBundle mainBundle] resourcePath ] stringByAppendingPathComponent:@"data.db"]; 
    NSString *documentsFolder = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 
    NSString *documentsPath = [documentsFolder stringByAppendingPathComponent:@"data.db"]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    if (![fileManager fileExistsAtPath:documentsPath isDirectory:NO]) { 
     NSError *error; 
     if (![fileManager copyItemAtPath:bundlePath toPath:documentsPath error:&error]) { 
      NSLog(@"database copy failed: %@", error); 
     } 
    } 

    const char *dbpath = [documentsPath UTF8String]; 

    if (sqlite3_open(dbpath, &db) == SQLITE_OK) { 
     const char *insertSql = "INSERT INTO MyTable (id) VALUES (?)"; 
     if (sqlite3_prepare_v2(db, insertSql, -1, &statement, NULL) != SQLITE_OK) { 
      NSLog(@"prepare error: %s", sqlite3_errmsg(db)); 
     } 

     // bind a value to the ? placeholder in the SQL 

     if (_Id) { 
      if (sqlite3_bind_text(statement, 1, [_Id UTF8String], -1, SQLITE_TRANSIENT) != SQLITE_OK) { 
       NSLog(@"bind text error: %s", sqlite3_errmsg(db)); 
      } 
     } else { 
      if (sqlite3_bind_null(statement, 1) != SQLITE_OK) { 
       NSLog(@"bind null error: %s", sqlite3_errmsg(db)); 
      } 
     } 

     if (sqlite3_step(statement) == SQLITE_DONE) { 
      NSLog(@"DONE"); 
     } else { 
      NSLog(@"Failed to add contact: %s", sqlite3_errmsg(db)); 
     } 

     sqlite3_finalize(statement); 
     sqlite3_close(db); 
    } 
} 

大多數人動,「如果數據庫中沒有在文件存在,然後從包中複製它並從那裏打開「專用openDatabase方法內的邏輯,但希望這可以說明這個想法。

+0

謝謝你的回覆。我這樣做,但我的數據庫沒有更新,我仍然看到「DONE」顯示:( – KhoaNN

+0

@KhoaNN你在看設備/模擬器的Documents文件夾中的數據庫(而不是捆綁中的或在你的項目)? – Rob

+0

我正在查看數據庫「/ Volumes/DATA/KhoaNN/Library/Application Support/iPhone Simulator/7.1/Applications/485F9F41-683F-44C7-9A63-A16FE5609853/MyApplication.app/data.db」 – KhoaNN