2016-04-12 5 views
1

に基づいており、ほとんどのものを管理しているが、実際にUPDATEに貼り付けていますが、私はその_ID番号を基準にして、1列目の刺し傷を更新しようとしていますのObjective C Sqliteを更新クエリがラッパーを使用せずにSQLiteにも学ぼうとID

を問い合わせますこれは主キーであり、ユニークです。

私はすべての種類のコードをgoogleから試しました。この1は、それが働いていると言うが、私は列が

を更新されていない確認したときに、ここでそれは、DBのvistorlog.dbは、[OK]を開くコード

  NSDateFormatter *formatter; 
      NSString  *dateString; 
      formatter = [[NSDateFormatter alloc] init]; 
      [formatter setDateFormat:@"dd-MM-yyyy HH:mm"]; 
      dateString = [formatter stringFromDate:[NSDate date]]; 
      NSString *IDCODE = code.stringValue; 
      NSInteger b = [IDCODE integerValue]; 
      sqlite3 *contactDB; //Declare a pointer to sqlite database structure 
      const char *dbpath = [dbPath UTF8String]; // Convert NSString to UTF-8 
      if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) 
      { 
       //Database opened successfully 
       NSString *databaseName = @"vistorlog.db"; 
       // Get the path to the documents directory and append the databaseName 
       NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
       NSString *documentsDir = [documentPaths objectAtIndex:0]; 
       NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 
       const char *dbPath=[databasePath UTF8String]; 
       if (sqlite3_open(dbPath, &myDB)==SQLITE_OK) { 
        NSLog(@"database Opened"); 
        const char* updateQuery="update LOG set TIMEOUT='22/03/19' where _ID=1"; 
        sqlite3_stmt *stmt; 
        if (sqlite3_prepare_v2(myDB, updateQuery, -1, &stmt, NULL)==SQLITE_OK) { 
         NSLog(@"Query Executed"); 
        }else{ 
         NSLog(@"Query NOT Executed"); 
               } 
       } 
       sqlite3_close(myDB); 
       } 
       else { 
       //Failed to open database 
      } 

です。 LOGと呼ばれるテーブルがあり、TIMEOUTという列があります。この列には、文字列を更新したいところがありますが、_IDという列がありますが、まだ更新されていないクエリをベースにしています。

更新ステートメントに文字列変数dateStringを更新する文字列として使用し、bを_IDの整数変数として使用するようにするには

すべてのヘルプは、マーク

EDIT

WORKING CODEはsqlite3.h

マーク

をインポートすることを忘れないでくださいQUERY

sqlite3 *contactDB; //Declare a pointer to sqlite database structure 
      const char *dbpath = [dbPath UTF8String]; // Convert NSString to UTF-8 
      if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) 
      { 
       //Database opened successfully 
       NSString *databaseName = @"vistorlog.db"; 
       // Get the path to the documents directory and append the databaseName 
       NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
       NSString *documentsDir = [documentPaths objectAtIndex:0]; 
       NSString *databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 
       const char *dbPath=[databasePath UTF8String]; 
       if (sqlite3_open(dbPath, &myDB)==SQLITE_OK) { 
        NSLog(@"database Opened"); 

// define dateString and IDCODE as strings before this 
        const char *updateQuery = "Update log set TIMEOUT=? where _ID=?"; 
        sqlite3_stmt *stmt; 
        // Prepare Stment 
        if (sqlite3_prepare_v2(myDB, updateQuery, -1, &stmt, NULL) == SQLITE_OK) { 
         sqlite3_bind_text(stmt, 1, [dateString UTF8String], -1, SQLITE_TRANSIENT); 
         sqlite3_bind_text(stmt, 2, [IDCODE UTF8String], -1, SQLITE_TRANSIENT);       if(sqlite3_step(stmt) == SQLITE_DONE) { 
          NSLog(@"Query Executed"); 
         } else { 
          NSLog(@"Query NOT Executed: %s", sqlite3_errmsg(myDB)); 
         } 
         sqlite3_finalize(stmt); 

        }else{ 
         NSLog(@"Statement NOT Prepared: %s", sqlite3_errmsg(myDB)); 
        } 
       } 
       sqlite3_close(myDB); 
       } 
       else { 
       //Failed to open database 
      } 

を更新するために

を高く評価しました

+0

を実行した後sqlite3_step()を実行する必要がありますか?また、 '[NSString stringWithUTF8String:sqlite3_errmsg(myDB)]'を使用して生成されたエラーメッセージを出力することもできます。これはsqlite3_prepare_v2ステートメントの後で行います。少なくとも更新呼び出しでどのようなエラーが発生しているかを教えてください。 – Commander147

+0

なぜ 'sqlite3_open'を2回呼び出しますか?なぜあなたはそれらのうちの1つだけを閉じますか? – rmaddy

+0

すべてのフィールドは、Integerの_ID以外のテキストです –

答えて

1

文を準備するだけで、実際には実行しません。

あなたはTIMEOUTフィールドのタイプsqlite3_prepare_v2

if (sqlite3_prepare_v2(myDB, updateQuery, -1, &stmt, NULL) == SQLITE_OK) { 
    if(sqlite3_step(stmt) == SQLITE_DONE) { 
     NSLog(@"Query Executed");  
    } else { 
     NSLog(@"Query NOT Executed: %s", sqlite3_errmsg(myDB)); 
    } 
    sqlite3_finalize(stmt); 

}else{ 
    NSLog(@"Statement NOT Prepared: %s", sqlite3_errmsg(myDB)); 
} 
+0

準備が整ったら、それを完了する必要があります。 – rmaddy

+0

ステートメントをファイナライズしてもポイントが残っていても行は更新されません。単にリソースがリークするだけです。 – dtrotzjr

+0

'sqlite3_errmsg'への呼び出しを各' else'ブランチに追加して、適切なエラーログを実証します。 – rmaddy

関連する問題