SQLite:一种轻量的本地数据库,方便嵌入系统,支持跨平台,根据工作经验来看,无论是Android还是iOS大多都采用SQLite
首先我们需要新建一个数据库,我们给他起名personinfo.sqlite,创建一张叫做person的表,里面有三个字段 name,age,sex。数据库存放在iOS的沙盒文件Document目录下,
#define DBName @"personinfo.sqlite" #define table @"PERSONINFO" #define Name @"Name" #define Age @"Age" #define Sex @"Sex"
//自己命名数据库,返回该数据库地址 -(NSString *)DB_path{ NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documents=[paths objectAtIndex:0]; return [documents stringByAppendingPathComponent:DBName]; //return database_path; }stringByAppendingPathComponent方法:如果文件已经存在,就返回该文件地址,如果没有则新建文件
新建好数据库后,所有数据库的操作,都得先打开数据库,SQLite中使用sqlite3_open方法
// 创建数据库文件,并返回数据库目录 NSString *DB_path=[self DB_path]; // 打开数据库 if (sqlite3_open([DB_path UTF8String], &db)!=SQLITE_OK) { //open fail sqlite3_close(db); NSLog(@"open fail"); }
//传入sql 执行sql语句,例如insert,delete, -(void)execute_sql:(NSString *)sql{ char *err; if (sqlite3_exec(db,[sql UTF8String], NULL, NULL, &err)!=SQLITE_OK) { sqlite3_close(db); NSLog(@"数据库操作失败"); }else{ NSLog(@"SUCCESS"); } }
需要先用sqlite3_prepare_v2将sql语句准备好,接着用sqlite_step一条一条读取数据,每条数据可能包含不同数据,也要用sqlite_column_xxx将他们一个一个读取出来
// sqlite3_prepare 将UTF-8格式的SQL语句转换为指向已备语句的指针 if (sqlite3_prepare_v2(db, [sqlQuery UTF8String], -1, &statement, nil) == SQLITE_OK) { while (sqlite3_step(statement) == SQLITE_ROW) { int num = sqlite3_column_int(statement, 0); char *name = (char*)sqlite3_column_text(statement, 1); NSString *nsNameStr = [[NSString alloc]initWithUTF8String:name]; int age = sqlite3_column_int(statement, 2); char *sex = (char*)sqlite3_column_text(statement, 3); NSString *SexStr = [[NSString alloc]initWithUTF8String:sex]; NSLog(@"id:%d name:%s age:%d sex:%s",num,name,age, sex); NSLog(@"id:%d name:%@ age:%d sex:%@",num,nsNameStr,age, SexStr); } }
第三方框架FMDB是对SQLite的一种封装。主要是执行有数据返回的语句时非常方便了
FMDB与SQLite基本类似
首先也是获得数据库(新建数据库就不说了):
//根据数据库路径获得数据库 FMDatabase *db=[FMDatabase databaseWithPath:fileName];
//打开数据库 [db open];
数据库增删改等操作:
除了查询操作,FMDB数据库操作都执行executeUpdate方法,这个方法返回BOOL型。
[db executeUpdate:sql];
// 1.执行查询语句 FMResultSet *resultSet = [db executeQuery:@"SELECT * FROM t_student"]; // 2.遍历结果 while ([resultSet next]) { int ID = [resultSet intForColumn:@"id"]; NSString *name = [resultSet stringForColumn:@"name"]; int age = [resultSet intForColumn:@"age"]; NSLog(@"%d %@ %d", ID, name, age); }