2012-01-26 10 views
9

sqlite veritabanıma eklediğim veya değiştirdiğim verilerle bazı beklenmedik sonuçlar yaşıyorum. Sorun çekmek için aşağıdaki kodda hazırlanmış sqlite3_stmt (ifade) tam bir baskı elde etmeye çalışıyorum sorun. Ben yapmak istiyorum neiOS/sqlite - Hazırlıklı bir sqlite3_stmt'yi NSLog'a yazdırma

böyle bir şeydir, ama çalışmıyor biliyorum:

if (sqlite3_step(statement) == SQLITE_DONE) { 
      NSLog(@"%@", statement); 

Bunu gerçekleştirmek için yine de var mı?

Teşekkürler!

sqlite3_stmt *statement; 
const char *dbPath = [databasePath UTF8String]; 

if (true) { 

    ListingsObject *temp = (ListingsObject *) DatabaseObject; 

    if (sqlite3_open(dbPath, &conyDB) == SQLITE_OK) { 

     const char *insertReplaceStmt = "INSERT OR REPLACE INTO listings (id, association_id, name, email, phone, toll_free_phone, fax, website, street, city, state, zipcode, county, bio, featured, hours, lat, lng, updated, status) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; 

     if (sqlite3_prepare_v2(conyDB, insertReplaceStmt, -1, &statement, NULL) == SQLITE_OK) { 
      sqlite3_bind_text(statement, 1, [temp._id UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 2, [temp.associationId UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 3, [temp.name UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 4, [temp.email UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 5, [temp.phone UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 6, [temp.tollFreePhone UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 7, [temp.fax UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 8, [temp.website UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 9, [temp.street UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 10, [temp.city UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 11, [temp.state UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 12, [temp.zipcode UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 13, [temp.county UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 14, [temp.bio UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 15, [temp.featured UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 16, [temp.hours UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 17, [temp.lat UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 18, [temp.lng UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 19, [temp.updated UTF8String], -1, SQLITE_TRANSIENT); 
      sqlite3_bind_text(statement, 20, [temp.status UTF8String], -1, SQLITE_TRANSIENT); 

     } 
     if (sqlite3_step(statement) == SQLITE_DONE) { 
      NSLog(@"Insert or Replace to Listing Table successful Listing = %@", temp.name); 

     }else { 
      NSLog(@"Failed to add to Listing table Listing = %@", temp.name); 
     } 
     sqlite3_finalize(statement); 
    } 
sqlite3_close(conyDB); 

GÜNCELLEME: Bu soruya bir yanıt bulamadı. Ama devam etmem gerekiyordu, bu yüzden sadece NSLog() ile bir dizge oluşturdum; Benim tablolardan her biri için aşağıdaki gibi kontrol etmek zorunda:

NSLog(@"  INSERT OR REPLACE INTO listings (id, association_id, name, email, phone, toll_free_phone, fax, website, street, city, state, zipcode, county, bio, featured, hours, lat, lng, updated, status) VALUES (\"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")", temp._id, temp.associationId, temp.name, temp.email, temp.phone, temp.tollFreePhone, temp.fax 
        , temp.website, temp.street, temp.city, temp.state, temp.zipcode, temp.county, temp.bio, temp.featured, temp.hours, temp.lat, temp.lng, temp.updated, temp.status); 
+0

neler sorun mu yaşıyorsunuz? Hata nedir? Bunu yayınlayabilir misin? –

+0

Hiç bir hata alamıyorum. Veritabanımın davranışı beklendiği gibi çalışmıyor. Bu ve diğer ifadelerin farklı varyasyonlarını hızlı bir şekilde deneyebileceğim bir sqlite yönetici programında çekim yapmakta zorluk çekmek istiyorum. Ne olup bittiğini yazdırabilirsem, yapıştırmak için benim için çok hızlı olurdu. Teşekkürler – KevinM

+4

Derlenmiş deyimi yazdırabileceğini sanmıyorum ama sql sorgusunu yazdırabiliyorsunuz .. iOS'ta sqlite için yeniyseniz FMDB'yi kesinlikle tavsiye ederim .. onun sqlite için çok iyi bir sarıcı .. bulabilirsiniz github https://github.com/ccgus/fmdb – Saurabh

cevap

5

bunun için bir standart yöntem bulamadık, bu yüzden ben kendi yaptı:

-(NSMutableString*) sqlite3StmtToString:(sqlite3_stmt*) statement 
{ 
    NSMutableString *s = [NSMutableString new]; 
    [s appendString:@"{\"statement\":["]; 
    for (int c = 0; c < sqlite3_column_count(statement); c++){ 
     [s appendFormat:@"{\"column\":\"%@\",\"value\":\"%@\"}",[NSString stringWithUTF8String:(char*)sqlite3_column_name(statement, c)],[NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, c)]]; 
     if (c < sqlite3_column_count(statement) - 1) 
      [s appendString:@","]; 
    } 
    [s appendString:@"]}"]; 
    return s; 
} 

Böyle diyoruz:

NSLog(@"%@",[self sqlite3StmtToString:statement]); 

Gözlem: Ben self ile bu çağrı ancak herhangi sınıfta yapabilirsiniz çünkü aynı sınıfta yaptım

+0

Bunu her zaman sqlite3_mutex_enter (db-> muteks) '' sqlite3.c''de 'EXC_BAD_ACCESS' üstünde kırılmış buldum. –

+0

@ ing0 Üzgünüm ama ne demek istediğini anlamadım. – ademar111190

+0

Yönteminizi derlenmiş durumumla karşılaştırdım (sqlite3_stmt *) ve bir çalışma zamanı hatası oluştu. –