我已经能够在我的应用程序中连接到 MySQL 数据库并使用 C API,它几乎与 PHP 命令(mysql_real_connect()、mysql_query()、mysql_fetch_array() 等)完全一样,而且我非常喜欢满意 我只是不确定数据查询是如何返回的。我是使用数组还是字典,然后我将如何解析它。例如,在 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];
}
最佳答案
Apple 没有为 MySQL 提供 Objective-C API。不过,有一些 C API 的第三方包装器。看看 MySQL-Cocoa Framework ,例如。
如果您熟悉 PHP 和 C API,那么使用 C API 可能更直接。您需要处理对象和 C 数据类型之间的转换,但这不是什么工作。
编辑
您正在崩溃,因为 mysql API 返回的行值不是一个对象,并且您的格式字符串告诉 NSLog
将其视为一个对象。 %@
是对象的格式字符串占位符,而不是 C 数据类型。
不清楚在这种情况下的值(value)是什么。上下文似乎暗示它是图像数据。如果是这种情况,您可能希望从查询返回的 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 ];
关于mysql - Objective-C 和 MySQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6046832/