-1

このクエリを実行しようとしていますが、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
}

私のクエリの何が問題なのですか?クエリを実行してDBを開いたり、ifループ内でログを出力したりしないのはなぜですか...誰かが私のコードを修正できますか?

4

2 に答える 2

1

ミドゥンは正しいです。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);
于 2012-12-22T14:35:24.140 に答える
0

この行は問題を引き起こします:

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

上記のコードでは、パラメーターが正しくありません。

データベース パスの代わりに SQL クエリを渡しています。

これは、データベースが開かれておらず、if 条件が失敗するためです。そのため、出力が得られません。

の最初のパラメータとしてデータベース パスを渡しますsqlite3_open。うまくいきます。

于 2012-12-22T13:36:21.503 に答える