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语句比较方便,只要使用sqlite3_exec即可
//传入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执行有返回数据的时候就比较麻烦
需要先用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];
查询语句都使用executeQuery
// 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); }