iOS / sqlite - Como imprimir um sqlite3_stmt preparado para o NSLog

9

Estou tendo alguns resultados inesperados com os dados que estou inserindo ou substituindo no meu banco de dados sqlite. Para solucionar o problema, estou tentando obter uma impressão completa da sqlite3_stmt (instrução) preparada no código abaixo.

O que eu gostaria de fazer é algo assim, mas sei que não funciona:

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

Existe alguma maneira de conseguir isso?

Obrigado !!

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

ATUALIZAÇÃO: Eu não encontrei uma resposta para essa pergunta. Mas eu precisava seguir em frente, então acabei construindo uma string com NSLog (); como abaixo para cada uma das minhas tabelas eu tive que verificar:

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);
    
por KevinM 26.01.2012 в 12:54
fonte

1 resposta

5

Eu não encontrei nenhum método padrão para isso, então eu fiz o meu próprio:

-(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;
}

Você chama assim:

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

Observação: Eu fiz isso na mesma classe porque eu chamo isso com self , mas você pode fazer em qualquer classe

    
por ademar111190 31.10.2012 / 00:02
fonte