2011-05-18 74 views
6

我已经能够连接到我的应用程序中的MySQL数据库,并使用几乎完全像PHP命令(mysql_real_connect(),mysql_query(),mysql_fetch_array()等)的C API。)和我很舒服,我只是不知道如何返回数据查询。我是否使用数组或字典,然后如何解析它?例如,在PHP中,我会这样做(连接后):Objective-C和MySQL

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

这个objective-c等价物是什么?谢谢。

编辑:

OK,所以我取得了一些进步 - 我可以查询并获取字段数/行返回,似乎无法访问数据本身。这里是我的代码,我从MySQL文档和其他几个网站上拼接在一起:

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

回答

4

没有Apple提供的用于MySQL的Objective-C API。尽管如此,C API还有一些第三方包装器。例如,看看MySQL-Cocoa Framework

鉴于您对PHP和C API的熟悉程度,您只需简单地使用C API即可。您需要处理对象和C数据类型之间的转换,但这并不是什么成果。

编辑

你崩溃,因为MySQL的API返回的行值不是一个对象,你的格式字符串告诉NSLog把它当作一个。 %@是对象的格式字符串占位符,不是C数据类型。

目前尚不清楚这种情况下的价值。上下文似乎暗示它是图像数据。如果是这样的话,你可能会想创建从该查询返回的斑点,比如一个NSData对象:

NSData *imageData; 

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

如果结果字段仅仅是字符串,用NSString-initWithBytes:length:encoding:方法:

NSString *s; 

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