2011-05-18 13 views
6

He podido conectarme a una base de datos MySQL en mi aplicación y usar la API C, que es casi exactamente como los comandos PHP (mysql_real_connect(), mysql_query(), mysql_fetch_array(), etc.) y con lo cual estoy bastante cómodo. No estoy seguro de cómo se devuelve la consulta de datos. ¿Utilizo una matriz o diccionario y luego cómo lo analizaré? Por ejemplo, en PHP me gustaría hacer algo como lo que (después de la conexión):Objective-C y MySQL

$results = mysql_query("SELECT * FROM theDatabase"); 
if (mysql_num_rows($results) > 0) { 
    while($row = mysql_fetch_array($results)) { 
     print $row; 
    } 
} 

¿Cuál sería el objetivo a c equivalente? Gracias.

Editar:

OK, así que hice algunos progresos - Puedo hacer la consulta y obtener el número de campos/filas devueltas, simplemente parece que no puede acceder a los datos en sí. Aquí está mi código, que unirán de la documentación de MySQL y algunos otros sitios:

- (IBAction)dbConnect:(id)sender { 


NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
MYSQL mysql; 
mysql_init(&mysql); 

if (!mysql_real_connect(&mysql, "10.1.1.99", "******", "******", "oldphotoarchive", 0, NULL, 0)) { 
    NSLog(@"%@", [NSString stringWithUTF8String:mysql_error(&mysql)]); 
} else { 

    MYSQL_RES *result; 
    MYSQL_ROW row; 
    unsigned int num_fields; 
    unsigned int num_rows; 
    unsigned long *lengths; 

    if (mysql_query(&mysql,"SELECT * FROM photorecord")) { 
     // error 
    } else { // query succeeded, process any data returned by it 

     result = mysql_store_result(&mysql); 
     if (result) { 
      num_fields = mysql_num_fields(result); 
      while ((row = mysql_fetch_row(result))) { 
       lengths = mysql_fetch_lengths(result); 

       for(int i = 0; i < num_fields; i++) { 
              //the line below is my problem, printing row[i] fails, I get the GNU gdb error... 
        row[i] ? NSLog(@"%@", row[i]) : NSLog(@"wtf"); 
       } 
      } 


     } else {// mysql_store_result() returned nothing; should it have? 
      if (mysql_errno(&mysql)) { 
       NSLog(@ "Error: %s\n", mysql_error(&mysql)); 
      } else if (mysql_field_count(&mysql) == 0) { 
       // query does not return data 
       // (it was not a SELECT) 
       num_rows = mysql_affected_rows(&mysql); 
      } 
     } 

    } 

} 

[pool release]; 
} 

Respuesta

4

No hay API Objective-C suministrado por Apple para MySQL. Sin embargo, hay algunas envolturas de terceros de la API C. Eche un vistazo al MySQL-Cocoa Framework, por ejemplo.

Dada su familiaridad con la API de PHP y C, puede ser más sencillo para usted simplemente usar la API de C. Necesitará manejar la conversión entre objetos y tipos de datos C, pero esto no es mucho trabajo.

Editar

Estás Crashing debido a que el valor de la fila devuelta por la API de MySQL no es un objeto, y su cadena de formato está diciendo NSLog tratarlo como uno. El %@ es un marcador de posición de cadena de formato para un objeto, no un tipo de datos C.

No está claro cuál es el valor en este caso. El contexto parece implicar que se trata de datos de imagen. Si ese es el caso, es probable que desee crear un objeto NSData de la burbuja devuelto por la consulta, por ejemplo:

NSData *imageData; 

imageData = [[ NSData alloc ] initWithBytes: row[ i ] length: lengths[ i ]]; 
NSLog(@"imageData: %@", imageData); 
/* ...create NSImage, CGImage, etc... */ 
[ imageData release ]; 

Si sus campos de resultados son sólo cadenas, utilice NSString 's -initWithBytes:length:encoding: método:

NSString *s; 

s = [[ NSString alloc ] initWithBytes: row[ i ] length: lengths[ i ] 
         encoding: NSUTF8StringEncoding ]; 
NSLog(@"result column %d: %@", i, s); 
[ s release ];