2010-07-20 6 views
0

Je le code suivant:Problème avec instruction SQL

if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
    { 
     // Setup the SQL Statement and compile it for faster access 
     const char *sqlStatement = "select ZWAYPOINT_X, ZWAYPOINT_Y from ZWAYPOINT where ZMAP_ID %@", mapID; 
     sqlite3_stmt *compiledStatement; 
     if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
     { 
      // Loop through the results and add them to the Route Name array 
      while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
      { 
       // Read the data from the result row 
       if((char*)sqlite3_column_text(compiledStatement, 0) != NULL) 
       {          
        NSString *xCoordinate = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStatement, 0)]; 
        NSString *yCoordinate = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStatement, 1)]; 

        NSLog(@"xCoordinate: %@", xCoordinate); 
        NSLog(@"yCoordinate: %@", yCoordinate); 

        CLLocationCoordinate2D coordinate = {xCoordinate, yCoordinate}; 
        MapPin *pin = [[MapPin alloc]initWithCoordinates:coordinate 
                  placeName:@"Keenan Stadium" 
                 description:@"Tar Heel Football"]; 
        [self.mapView addAnnotation:pin]; 
        [pin release]; 
       } 
      } 
     } 
     else 
     { 
      NSLog(@"Error: failed to select details from database with message '%s'.", sqlite3_errmsg(database)); 
     } 

J'ai quelques questions:

  1. dans mon instruction SQL comment puis-je inclure les mapID variables dans le cadre de l'instruction SQL
  2. la ligne

    CLLocationCoordinate2D coordinate = {xCoordinate, yCoordinate};

me donne l'avertissement suivant "Types incompatibles dans l'initialisation"

Merci

+0

Vous pouvez résoudre votre problème de déclaration SQL en passant à Core Data;) – jer

+0

jer, assez drôle J'ai vu quelques personnes suggèrent cela lorsque des questions sur SQL sont postées. Je suis engagé maintenant si .... Je vais certainement revoir Core Data après avoir terminé cette application. Merci pour le conseil. – Stephen

+0

Ce n'est pas une instruction SQL, c'est un code de procédure. – onedaywhen

Répondre

0

Vous devez utiliser une déclaration paramétrés et lier les valeurs, comme ceci:

const char *sqlStatement = "select ZWAYPOINT_X, ZWAYPOINT_Y from ZWAYPOINT where ZMAP_ID = ?"; 
sqlite3_stmt *compiledStatement; 
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
{ 
    sqlite3_bind_text(compiledStatement, 1, [mapID UTF8String], -1, SQLITE_TRANSIENT); 

(Notez que lorsque les paramètres de liaison, vous commencez à 1, mais lors de la lecture des colonnes de lignes de résultat, vous commencez à 0 ...). Je suppose que votre mapID est un NSString puisque vous avez essayé de le coller dans votre requête en utilisant% @. Si c'est quelque chose d'autre, vous devrez utiliser un bind function différent et évidemment ignorer le UTF8String.

0

Pour inclure MapID,

Modifier ceci:

const char *sqlStatement = "select ZWAYPOINT_X, ZWAYPOINT_Y from ZWAYPOINT where ZMAP_ID %@", mapID; 

à ceci:

const char *sqlStatement = "select ZWAYPOINT_X, ZWAYPOINT_Y, MapID from ZWAYPOINT where ZMAP_ID %@", mapID; 
+0

Merci JonH, en train de relire mon post original, je ne m'expliquais pas très bien. mapID est défini comme une variable globale, qui est remplie à partir d'une autre table. Dans mon code ci-dessus, j'ai un avertissement 'Variable mapID'. Évidemment, chaque fois que ce code s'exécute, mapID peut contenir la variable. J'espère que c'est un peu plus clair. – Stephen