数据库使用之第三方库 FMDB
1. 引进 sqlite3 工具箱,在要进行数据库操作的类里引进头文件 : 因为第三方软件同样是使用 sqlite 工具箱来操作数据库的,只不过是简化了操作,让语法更接近 OC 的语法, 而不需要使用过多的 C 语法;
#import <sqlite3.h>
2. 将第三方库加载进工程:方法是直接将 FMDB 的源文件拖拽进工程即可;
3. 使用第三方库访问数据库
当然了,对于高手而言,对第三方库进行了解后,上手是很快的,对于小白,只能一步一步走啦。
3.1 指定数据库的存储路径,一般都是在沙盒根目录下地 Documents 文件夹下,文件的后缀名是 .sqlite:如 db_students.sqlite;
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/db_student.sqlite"];
3.2 先创建一个 FMDatabase 的对象 *_db;
FMDatabase *_db;
使用前要先初始化
_db = [[FMDatabase alloc] initWithPath:filePath];
看它的初始化方法:在初始化方法里没有做什么多余的操作,除了指定数据库存储的路径外,没有其他操作,0x00 是一个十六进制的地址,代表 nil(或者说 NULL )
创建并打开数据库:
[_db open];
这句代码的作用有两个:
1)若数据库不存在,则创建并打开;
2)若数据库已经存在,则打开数据库;
也许你还记得:sqlite3_open(path, &_db);
这两句代码的作用是一样的,只不过前者更接近 OC 的语法,其实质还是通过后者操作数据库的。
3.3 创建表
if (![_db tableExists:@"tb_students"]) { [_db executeUpdate:@"create table tb_students (ID integer primary key not null unique, name text, age integer)"]; } // 先调用方法,判断表是否已经存在,若不存在则创建表
整个过程则为:
NSString *filePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/db_student.sqlite"]; _db = [[FMDatabase alloc] initWithPath:filePath]; if ([_db open]) { if (![_db tableExists:@"tb_students"]) { [_db executeUpdate:@"create table tb_students (ID integer primary key not null unique, name text, age integer)"]; } } [_db close]; // 当对数据库的操作结束后不要忘记关闭数据库
3.4 插入、删除、更新、查询表的操作
第一步:打开数据库
第二部:数据库操作
第三部:关闭数据库
需要注意的是,在进行对表的插入、删除、更新时,调用的方法是 - (BOOL)executeUpdate:(NSString*)sql, ...;
看示例:
- (void)insertTable:(ZYStudent *)stu { if ([_db open]) { [_db executeUpdate:@"insert into tb_students (name, age) values (?, ?)", stu.name, [NSNumber numberWithInt:stu.age]]; } // 这里需要注意的是:替换 sql 语句里的 ?,不能直接使用基本类型的数据,而是需要将基本类型转换为 对象类型,符合 OC 的语法 [_db close]; }
对表进行查询时,调用的方法是: - (FMResultSet *)executeQuery:(NSString*)sql, ...;
原因大概也都知道:插入、删除、更新操作时,主要表现出来的变化是数据表,受影响的时表中的行(即一条或几条记录),而查询操作不同,进行查询操作的目的就是要获得表中的数据,那么就应该将获得数据存储,这样就新引用了一个概念:结果集(ResultSet)。
在查询操作里:可以简单的将理解为结果集是用来接收查询数据的,然后就可以将数据从结果集取出来,通过一定手段展示出来。
- (void)selectTable { NSMutableArray *array = [NSMutableArray array]; if ([_db open]) { FMResultSet *rs = [_db executeQuery:@"select * from tb_students"]; while ([rs next]) { ZYStudent *stu = [[[ZYStudent alloc] init] autorelease]; stu.ID = [rs intForColumnIndex:0]; stu.name = [rs stringForColumnIndex:1]; stu.age = [rs intForColumnIndex:2]; [array addObject:stu]; } } [_db close]; NSLog(@"________%@", array); }