2012-01-26 24 views
9

Tôi đang gặp một số kết quả không mong muốn với dữ liệu tôi đang chèn hoặc thay thế vào cơ sở dữ liệu sqlite của mình. Để giải quyết vấn đề, tôi đang cố gắng lấy một bản in đầy đủ từ câu lệnh sqlite3_stmt đã chuẩn bị trong đoạn mã dưới đây.iOS/sqlite - Cách in sqlite3_stmt chuẩn bị sang NSLog

Những gì tôi muốn làm là một cái gì đó như thế này, nhưng tôi biết nó không hoạt động:

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

Liệu có cách nào để thực hiện điều này?

Cảm ơn !!

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); 

CẬP NHẬT: Tôi chưa tìm thấy câu trả lời cho câu hỏi này. Nhưng tôi cần phải tiếp tục vì vậy tôi đã kết thúc việc xây dựng một chuỗi với NSLog(); như sau cho mỗi một trong các bảng của tôi, tôi đã phải kiểm tra:

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

gì vấn đề bạn đang nhận được? Lỗi là gì? Bạn có thể plz đăng bài đó? –

+0

Tôi không nhận được bất kỳ lỗi nào. Nó chỉ là hành vi của cơ sở dữ liệu của tôi không hoạt động như mong đợi. Tôi muốn làm rắc rối trong một chương trình quản lý sqlite, nơi tôi có thể nhanh chóng thử các biến thể khác nhau của điều này và các phát biểu khác. Nếu tôi có thể in ra những gì đang diễn ra thì sẽ rất nhanh chóng cho tôi để sao chép bất kỳ dán nó lên. Cảm ơn – KevinM

+4

Tôi không nghĩ rằng bạn có thể in câu lệnh biên dịch nhưng bạn có thể in truy vấn sql .. nếu bạn mới dùng sqlite trong iOS, tôi khuyên bạn nên dùng FMDB .. một trình bao bọc rất tốt cho sqlite .. bạn có thể tìm thấy nó trên github https://github.com/ccgus/fmdb – Saurabh

Trả lời

5

tôi không tìm thấy bất kỳ phương pháp tiêu chuẩn này, vì vậy tôi làm của riêng tôi:

-(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ạn gọi nó là như thế này:

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

Observation: tôi đã làm điều đó trong cùng một lớp học vì tôi gọi đây với self nhưng bạn có thể làm trong bất kỳ lớp

+0

Tôi thấy điều này luôn luôn phá vỡ trên một 'EXC_BAD_ACCESS' trên' sqlite3_mutex_enter (db-> mutex); 'trong' sqlite3.c'. –

+0

@ ing0 xin lỗi nhưng tôi không hiểu ý bạn là gì. – ademar111190

+0

Tôi chạy phương pháp của bạn chống lại statment biên dịch của tôi (sqlite3_stmt *) và có một lỗi thời gian chạy. –

Các vấn đề liên quan