mysql - Objective-C 和 MySQL

标签 mysql objective-c

我已经能够在我的应用程序中连接到 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/

相关文章:

iPhone:DatePicker dd/mm/yyyy

iphone - 如何将 ABRecordRef 添加到 iPhone 中的 NSMutableArray?

iOS 在代码中创建 TableViewCell

mysql 循环不工作

mysql - 如何返回 MySQL 过程作为触发器?

ios - 带有日期字符串的 NSString 的时区是什么?

objective-c - 使用 Cocoa 将图标(mac 和 pc)添加到文件中

mysql - 一对多 MySQL

mysql - 计算有条件的行数

php - MySQL 数据库中的范围 slider 和值