【问题标题】:iOS / sqlite - How to print a prepared sqlite3_stmt to NSLogiOS / sqlite - 如何将准备好的 sqlite3_stmt 打印到 NSLog
【发布时间】:2012-02-19 12:36:54
【问题描述】:

我正在插入或替换到我的 sqlite 数据库中的数据有一些意外的结果。为了解决这个问题,我试图在下面的代码中从准备好的 sqlite3_stmt (语句)中得到完整的打印。

我想做的是这样的,但我知道它不起作用:

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

有没有办法做到这一点?

谢谢!!

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

更新: 我还没有找到这个问题的答案。但是我需要继续前进,所以我最终只是用 NSLog(); 构造​​了一个字符串;对于我必须检查的每一张桌子,如下所示:

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

【问题讨论】:

  • 您遇到了什么问题?错误是什么?可以发一下吗?
  • 我没有收到任何错误。只是我的数据库的行为没有按预期工作。我想在一个 sqlite manager 程序中进行故障排除,在那里我可以快速尝试这个语句和其他语句的不同变体。如果我可以打印出正在发生的事情,那么我将很快复制任何粘贴它。谢谢
  • 我不认为你可以打印编译后的语句,但你可以打印 sql 查询。如果你是 iOS 中的 sqlite 新手,我强烈推荐你使用 FMDB 。它是一个非常好的包装器sqlite..你可以在github上找到它github.com/ccgus/fmdb

标签: ios database sqlite prepared-statement nslog


【解决方案1】:

我没有找到任何标准方法,所以我自己做了:

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

你这样称呼它:

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

观察:我在同一堂课上做过,因为我用self 调用它,但你可以在任何课上做

【讨论】:

  • 我发现这总是在sqlite3_mutex_enter(db-&gt;mutex);sqlite3.c 中的EXC_BAD_ACCESS 上中断。
  • @ing0 抱歉,我不明白你的意思。
  • 我针对我编译的语句 (sqlite3_stmt*) 运行了您的方法,但出现运行时错误。
  • @ing0 明白了,你能把它发生时的条件发给我吗?
  • 看起来问题在于包含没有赋值的列的语句(实际上是所有选择语句),sqlite3_column_text 然后返回 nil 并且随后尝试创建 UTF8 字符串会导致崩溃。检查该值是否为 nil 并且它不会崩溃,但它可能对您没有帮助,因为您需要一些其他函数来获取绑定数据(sqlite3_column_value ?)
猜你喜欢
  • 1970-01-01
  • 2010-11-26
  • 2013-03-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多