我已经能够在我的应用程序中连接到MySQL数据库,并使用几乎与PHP命令(mysql_real_connect()、mysql_query()、mysql_fetch_array()等)完全相同的C应用程序接口。我对此很满意,我只是不确定数据查询是如何返回的。我应该使用数组还是字典,然后如何解析它。例如,在PHP中,我会这样做(在连接之后):
$results = mysql_query("SELECT * FROM theDatabase");
if (mysql_num_rows($results) > 0) {
while($row = mysql_fetch_array($results)) {
print $row;
}
}objective-c的等价物是什么?谢谢。
编辑:
好了,我取得了一些进展-我可以进行查询并获得返回的字段/行的数量,但似乎不能访问数据本身。以下是我的代码,它是我从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];
}发布于 2011-05-18 23:36:58
没有苹果公司提供的用于MySQL的Objective-C API。不过,C API也有一些第三方包装器。例如,让我们看看MySQL-Cocoa Framework。
如果您熟悉PHP和C API,那么简单地使用C API可能会更简单。您将需要处理对象和C数据类型之间的转换,但这不是很多工作。
编辑
崩溃的原因是mysql API返回的行值不是对象,而格式字符串告诉NSLog将其视为对象。%@是对象的格式字符串占位符,而不是C数据类型。
目前还不清楚这种情况下的值是什么。上下文似乎暗示它是图像数据。如果是这种情况,您可能希望从查询返回的blob创建一个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 ];https://stackoverflow.com/questions/6046832
复制相似问题