2016-04-12 26 views
1
sarıcı kullanmadan SQLite öğrenmek için çalışıyorum

dayanarak ve birçok şey başarmış ama gerçekten GÜNCELLEME şaşırıpObjective C SQLite Güncelleme Sorgusu kimliği

Ben onun _ID sayısına bağlı olarak tek bir sütunda bir acı güncellemeye çalışıyorum sorgular Bu birincil Anahtar ve benzersizdir.

Google'ın her yerinden tüm kodları denedim. Bu kimse çalıştı diyor ama sütun

güncellenmedi kontrol ederken burada kod

  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 
      } 

Tamam DB vistorlog.db açar olduğunu. LOG adında bir tablo var ve orada TIMEOUT denilen dize hangi dize güncelleştirmek istediğiniz ve orada ne bir temelde _ID denen bir sütun var ben henüz sorguyu temel alıyor

sonunda istiyorum update deyimine sahip olmak için string string dateString öğesini güncellemek ve b tamsayı değişkeni olarak _ID

yanlış nereye gittiğime dair bir fikre sahip olmak için?

Herhangi bir yardım

DÜZENLEME

ÇALIŞMA KOD bir sorgu

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 
      } 
GÜNCELLENİR Mark

takdir

sqlite3.h ithal etmeyi unutmayın

Mark

+0

ZAMAN AŞIMI alanında ne tür yürütmek sonra

Sen sqlite3_step() yürütmek gerekiyor? Ayrıca, '[NSString stringWithUTF8String: sqlite3_errmsg (myDB)] kullanarak oluşturduğunuz hata mesajını yazdırabilirsiniz. Bunu sqlite3_prepare_v2 ifadenizden sonra yapın. Bu, en azından güncelleme çağrısında hangi hatanın gerçekleştiğini size söylemelidir. – Commander147

+0

Neden iki kez sqlite3_open 'diyorsun? Neden sadece birini kapatıyorsun? – rmaddy

+0

tüm alanlar bir Integar –

cevap

1

Yalnızca söz konusu ifadeyi hazırlıyorsunuz ancak gerçekte yürütmüyorsunuz. Eğer 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

olan _ID dışında metin vardır Ve onunla yapıldığında hazır deyimin sonuçlandırmak gerekir. – rmaddy

+0

İyi nokta ama güncelleştirilmesini satır tutmaz deyimi sonuçlandırılması değil, sadece kaynak sızıntıları yol açar. – dtrotzjr

+0

Ekleme 'Her' else' dalına sqlite3_errmsg' uygun hatalı günlüğünü göstermek için çağırır. – rmaddy