首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Objective-C和MySQL

问Objective-C和MySQL
EN

Stack Overflow用户
提问于 2011-05-18 22:58:56
回答 1查看 10.6K关注 0票数 6

我已经能够在我的应用程序中连接到MySQL数据库,并使用几乎与PHP命令(mysql_real_connect()、mysql_query()、mysql_fetch_array()等)完全相同的C应用程序接口。我对此很满意,我只是不确定数据查询是如何返回的。我应该使用数组还是字典,然后如何解析它。例如,在PHP中,我会这样做(在连接之后):

代码语言:javascript
复制
$results = mysql_query("SELECT * FROM theDatabase"); 
if (mysql_num_rows($results) > 0) { 
    while($row = mysql_fetch_array($results)) {
       print $row;
    }
}

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

编辑:

好了,我取得了一些进展-我可以进行查询并获得返回的字段/行的数量,但似乎不能访问数据本身。以下是我的代码,它是我从MySQL文档和其他几个站点中拼接而成的:

代码语言:javascript
复制
- (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];
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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对象,例如:

代码语言:javascript
复制
NSData    *imageData;

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

如果您的结果字段只是字符串,则使用NSString的-initWithBytes:length:encoding:方法:

代码语言:javascript
复制
NSString    *s;

s = [[ NSString alloc ] initWithBytes: row[ i ] length: lengths[ i ]
                        encoding: NSUTF8StringEncoding ];
NSLog( @"result column %d: %@", i, s );
[ s release ];
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6046832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档