当我搜索objective-c连接MySQL数据库,发现文章已经是很久之前的了,而且是错误的,一篇错,然后连续十几篇都接着错。
好,废话不多说,要连接数据库,首先你得安装MySQL,网上一大堆教程。安装完毕,你需要在终端上敲:mysql --version验证是否安装成功,如果有东西输出,说明你安装成功了。
关于怎么建立数据库,怎么建表,这里也不作描述,百度上搜索一大堆。我这里创建了一个叫"lws_db"的数据库,其中只有一个表。表包括id,name,sex,age,tel几个字段,如图所示:
sql语句如下:
create table students ( id int unsigned not null auto_increment primary key, name char(8) not null, sex char(4) not null, age tinyint unsigned not null, tel char(13) null default "-" );
好了,数据库弄好了。接下来就要用代码连接数据库了。新建一个xCode项目,使用xCode 6.3.2版本,这里我选择了命令行项目。
由于,mysql驱动文件放在,这个目录下:/usr/local/mysql/include,所以需要在你的项目中配置头文件搜索路径,操作如图:
同时,你需要告诉编译器编译参数,在other linker flags添加:-L/usr/local/mysql/lib -lmysqlclient,如图所示:
好的,项目配置好了,接下来上代码:
新建一个类DBManager,用于管理数据库操作,代码如下:
.h文件
1 #import <Foundation/Foundation.h> 2 3 @class Person; 4 5 @interface DBManager : NSObject 6 7 + (DBManager *)sharedManager; 8 9 - (NSArray *)getAllPersons; 10 - (void)addPerson:(Person *)p; 11 - (void)deletaPerson:(Person *)p; 12 13 @end
.m文件
1 #import "DBManager.h" 2 #import "mysql.h" 3 #import "Person.h" 4 5 static const char *host_name = "localhost"; 6 static const char *user_name = "root"; 7 static const char *password = "root"; 8 static const char *db_name = "lws_db"; 9 10 @interface DBManager() { 11 MYSQL *_myconnect; 12 } 13 @end 14 15 @implementation DBManager 16 17 +(DBManager *)sharedManager 18 { 19 static DBManager *sharedSingleton = nil; 20 21 static dispatch_once_t onceToken; 22 23 dispatch_once(&onceToken,^(void) { 24 sharedSingleton = [[self alloc] init]; 25 }); 26 27 return sharedSingleton; 28 } 29 30 - (instancetype)init { 31 if (self = [super init]) { 32 //初始化工作 33 _myconnect = mysql_init(_myconnect); 34 _myconnect = mysql_real_connect(_myconnect,host_name,user_name,password,db_name,MYSQL_PORT,NULL,0); 35 mysql_set_character_set(_myconnect, "utf8"); 36 37 if (_myconnect != NULL) { 38 NSLog(@"连接成功"); 39 } else { 40 NSLog(@"连接失败"); 41 } 42 } 43 return self; 44 } 45 46 - (NSArray *)getAllPersons { 47 48 if (_myconnect == NULL) { 49 return nil; 50 } 51 52 int status = mysql_query(_myconnect, "select * from students");//status=0,表示query成功 53 54 if (status != 0) { 55 NSLog(@"查询数据失败"); 56 } 57 58 MYSQL_RES *result = mysql_store_result(_myconnect);//拿到结果集 59 60 long long rows =result->row_count; //一共查询到多少行 61 62 NSMutableArray *rowArray = [NSMutableArray arrayWithCapacity:rows];//创建数组保存数据 63 64 unsigned int fieldCount = mysql_field_count(_myconnect);//字段个数 65 66 MYSQL_ROW col;//用于保存一行的结果,其实就是一个字符串数组 67 68 for (int row = 0; row < rows; row++) { 69 70 NSMutableString *strM = [NSMutableString string]; 71 72 if((col = mysql_fetch_row(result))) 73 { 75 for(int i = 0; i < fieldCount; i++) 76 { 77 [strM appendString:[NSString stringWithUTF8String:col[i]]];//这里为了方便看结果,只返回字符串,而不是返回模型数组 78 [strM appendString:@" "]; 79 } 80 } 81 [rowArray addObject:strM]; 82 } 84 return rowArray; 85 } 86 87 - (void)addPerson:(Person *)p { 88 89 NSString *sql = [NSString stringWithFormat:@"insert into students (name, sex, age, tel) values(\'%@\', \'%@\', \'%@\',\'%@\')",p.name,p.sex,p.age,p.tel]; 90 91 int status = mysql_query(_myconnect, [sql UTF8String]);//status=0,表示query成功 92 93 if (status == 0) { 94 NSLog(@"插入数据成功"); 95 } else { 96 NSLog(@"插入数据失败"); 97 } 98 } 99 100 - (void)deletaPerson:(Person *)p { 101 102 NSString *sql = [NSString stringWithFormat:@"delete from students where id=%@",p.ID]; 103 104 int status = mysql_query(_myconnect, [sql UTF8String]);//status=0,表示query成功 105 if (status == 0) { 106 NSLog(@"删除数据成功"); 107 } else { 108 NSLog(@"删除数据失败"); 109 } 110 } 112 @end
main函数里面:
#import <Foundation/Foundation.h> #import "DBManager.h" #import "Person.h" void test() { DBManager *mgr = [DBManager sharedManager]; //查询数据 NSArray *array = [mgr getAllPersons]; for (int i = 0; i < array.count; i++) { NSLog(@"%@",array[i]); } /*输出结果 2015-06-27 15:01:29.290 MySqlTest[2451:145448] 连接成功 2015-06-27 15:01:29.291 MySqlTest[2451:145448] 1 李文深 男 23 12345678910 2015-06-27 15:01:29.291 MySqlTest[2451:145448] 2 张三 男 33 13099881235 2015-06-27 15:01:29.291 MySqlTest[2451:145448] 3 李四 女 20 - 2015-06-27 15:01:29.291 MySqlTest[2451:145448] 4 敌法师 男 8 18825694821 */
/*
person这个类的属性:
@property (nonatomic,copy) NSString *ID;
@property (nonatomic,copy) NSString *name;
@property (nonatomic,copy) NSString *sex;
@property (nonatomic,copy) NSString *age;
@property (nonatomic,copy) NSString *tel;
*/
//添加数据 Person *p = [[Person alloc] init]; p.name = @"传说哥"; p.age = @"50"; p.sex = @"男"; p.tel = @"11111111111"; // [mgr addPerson:p]; /* //删除数据 p.ID = @"1"; [mgr deletaPerson:p]; */ } int main(int argc, const char * argv[]) { @autoreleasepool { test(); } return 0; }
从DBManager这个类可以看出,MySQL驱动是以C语言api写成的,而在该类中,重新封装以objective-c接口暴露给调用者。当然笔者这里少了些很多判断性操作,也没关闭数据库,在实际项目中,还需要读者自己完善。