【问题标题】:Sqlite Query Loop not workingSqlite 查询循环不起作用
【发布时间】:2012-12-22 13:14:21
【问题描述】:

我正在尝试运行此查询,但 NSLog 既不工作也不显示警报 .. 查询不执行它不进入 if 循环

viewDidLoad{


pin_lat = pinAnnotation.coordinate.latitude;

NSLog(@"pin latitude is %f",pin_lat); //This one is only working

sqlite3_stmt *statement;

         NSString *qsql = [NSString stringWithFormat:@"SELECT name FROM site WHERE latitude LIKE %f AND longitude LIKE %f",pin_lat,pin_long];

   if (sqlite3_open([qsql UTF8String], &db) == SQLITE_OK){
     //  sqlite3_exec(db, [statement UTF8String],NULL, NULL, &err == SQLITE_OK);

         NSLog(@"QUERY IS WORKING IN OPEN DB");

    if (sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, nil)== SQLITE_OK)
    {
         NSLog(@"QUERY IS WORKING IN DB PREPARE");

        while(sqlite3_step(statement)==SQLITE_ROW)
        {
            /* char *field1 = (char *) sqlite3_column_text(statement, 3);  getting name value in field1
             NSString *field1Str =
             [[NSString alloc] initWithUTF8String: field1];
             [field1Str release];*/

            NSLog(@"QUERY IS WORKING");

            UIAlertView *alert_pin = [[UIAlertView alloc] initWithTitle:@"" message:@"Cannot create a duplicate location" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Done", nil];

            [alert_pin show];
            [alert_pin release];


        }

        //—-deletes the compiled statement from memory—-
        sqlite3_finalize(statement);
    }

    else{

        [mapView addAnnotation:pinAnnotation];  // this is working ... but i want the if loop to also work

    }

}

 sqlite3_close(db);
 // not exist to show alert
}

我的查询出了什么问题,为什么它不执行查询并打开数据库或在 if 循环中打印日志……任何人都可以更正我的代码……有什么帮助吗?

【问题讨论】:

  • NS在控制台中记录查询并在sqlite管理器上执行。我认为查询有问题
  • 是的,它可以工作..即使我进行查询“SELECT * from site”..它应该进入循环并显示也不起作用的 NSLog ...
  • 我只需要执行查询并显示警报 ..
  • sqlite_open 和 sqlite_prepare 中的 NSlogs 是否正常工作?
  • 没有一个工作...

标签: ios sql database xcode sqlite


【解决方案1】:

Midhun 是正确的。我进一步建议这些if 语句中的每一个都应该有一个相应的else 子句来显示返回代码以及(如果可能的话)错误消息。或者,等效地,检查每个步骤的故障,如果是,则报告诊断信息并返回。因此,它可能看起来像:

int rc;
sqlite3_stmt *statement;

NSString *qsql = [NSString stringWithFormat:@"SELECT name FROM site WHERE latitude LIKE %f AND longitude LIKE %f",pin_lat,pin_long];

if ((rc = sqlite3_open([path UTF8String], &db)) != SQLITE_OK) {
    NSLog(@"%s sqlite3_open failed: (%d)", __FUNCTION__, rc);
    return;
}

NSLog(@"QUERY IS WORKING IN OPEN DB");

if ((rc = sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, nil)) != SQLITE_OK) {
    NSLog(@"%s sqlite3_prepare_v2 failed: \"%s\" (%d)", __FUNCTION__, sqlite3_errmsg(db), rc);
    sqlite3_close(db);
    return;
}

NSLog(@"QUERY IS WORKING IN DB PREPARE");

while ((rc = sqlite3_step(statement)) == SQLITE_ROW)
{
    const char *field0 = (const char *)sqlite3_column_text(statement, 0); // getting name value in field1
    NSString *field0Str = [NSString stringWithUTF8String:field0];

    NSLog(@"QUERY IS WORKING: %@", field0Str);

    UIAlertView *alert_pin = [[UIAlertView alloc] initWithTitle:@"" message:@"Cannot create a duplicate location" delegate:nil cancelButtonTitle:nil otherButtonTitles:@"Done", nil];

    [alert_pin show];
    [alert_pin release];
}

if (rc != SQLITE_DONE)
{
    NSLog(@"%s sqlite3_step failed: \"%s\" (%d)", __FUNCTION__, sqlite3_errmsg(db), rc);
    sqlite3_finalize(statement);
    sqlite3_close(db);
}

if ((rc = sqlite3_finalize(statement)) != SQLITE_OK) {
    NSLog(@"%s sqlite3_finalize failed: \"%s\" (%d)", __FUNCTION__, sqlite3_errmsg(db), rc);
    sqlite3_finalize(statement);
    sqlite3_close(db);
}

sqlite3_close(db);

【讨论】:

    【解决方案2】:

    此行导致问题:

     if (sqlite3_open([qsql UTF8String], &db) == SQLITE_OK)
    

    上面代码中参数不正确。

    您传递的是 sql 查询而不是数据库路径。

    因为这个数据库没有打开,if 条件失败。这就是为什么你没有得到任何输出。

    将数据库路径作为sqlite3_open 的第一个参数传递。它会起作用的。

    【讨论】:

    • 哦,是的 .. 这个有效 .. if (sqlite3_open([path UTF8String], &db) == SQLITE_OK) .. 但在此之后 NSLog(@"QUERY IS WORKING IN OPEN DB");再次它没有进入循环
    • 使用查询 select *from site
    • 我现在正在使用 select * from site 但它没有进入循环.. 我在控制台上得到这个“QUERY IS WORKING IN OPEN DB”,而不是下一个 NSLog,也没有警报..
    • @user1900226:检查表中是否有任何值,然后检查表是否在数据库中创建
    • yup 数据库的所有其他查询都在其他文件中运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    相关资源
    最近更新 更多