在仿写知乎日报app的时候,收藏的文章要存放在数据库中,所以需要用到OC封装好的FMDB数据库。
什么是FMDB?
OC中使用C语言函数对原生SQLite数据库进行增删改查操作,复杂麻烦,于是,就出现了一系列将SQLite API封装的库。FMDB是针对libsqlite3框架进行封装的三方,它以OC的方式封装了SQLite的C语言的API,使用步骤与SQLite相似。
FMDB的优点
- FMDB面向对象,避免了复杂的C语言代码
- FMDB是轻量级框架,使用更加灵活、方便
- 提供了多线程的方式来操作数据库,可以防止多线程操作带来的数据混乱,保证了多线程安全跟数据准确性。
常使用的类
1、FMDatabase
sqlite的数据库对象,一个FMDatabase对象就代表了一个单独的sqlite数据库连接,用来执行SQLite的命令。
2、FMResultSet
sqlite的结果集,数据库查询结果集
3、FMDatabaseQueue
多线程,使用多线程对数据进行操作,是线程安全的。
4、FMDatabaseAdditions
扩展FMDatabase类,新增对查询结果只返回单个值的方法进行简化,对表、列是否存在、版本号、校验SQL等等功能。
5、FMDatabasePool
可以使用任务池的方式,对多线程的操作提供了支持
FMDB的使用举例
创建数据库
NSString* doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString* fileName = [doc stringByAppendingPathComponent:@"collection.sqlite"];
FMDatabase* database = [FMDatabase databaseWithPath:self.path];
注意:这里有个文件路径有三种形式
a、具体的文件路径
会根据具体的文件路径来创建相应的数据库,如果路径不存在,会自动创建
b、路径为空的字符串@“”
会在临时目录下面创建一个空的数据库,当FMDB连接关闭时,数据库文件也被删除。
c、当为nil的时候
会创建一个内存中临时数据库,当FMDatabase连接关闭时,数据库会被销毁
创建表
if([self.database open]) {
BOOL result = [self.database executeUpdate:@"CREATE TABLE IF NOT EXISTS t_collection(title text NOT NULL, imageURL text NOT NULL, webURL text NOT NULL, id text NOT NULL);"];
if (!result) {
NSLog(@"创建失败!");
} else {
NSLog(@"创建成功!");
}
} else {
NSLog(@"打开失败");
}
以上这个表就有四列内容:title、imageURL、webURL、id;
插入数据
- (void) insertData {
FMDatabase* database = [FMDatabase databaseWithPath:self.path];
if ([database open]) {
BOOL result = [database executeUpdate:@"INSERT INTO t_collection(title, imageURL, webURL, id) VALUES (?,?,?,?);",title, imageURL, web, id];
if (!result) {
NSLog(@"增加数据失败!\n");
} else {
NSLog(@"增加数据成功!\n");
}
[database close];
} else {
NSLog(@"打开数据库失败!\n");
}
}
VALUES(?,?,?,?)
中的"?"就相当于%@,后面是参数。
删除数据
- (void) deleteData {
FMDatabase* database = [FMDatabase databaseWithPath:self.path];
if ([database open]) {
NSString* sqlDelete = @"delete from t_collection WHERE imageURL = ?";
BOOL result = [database executeUpdate:sqlDelete, imageURL];
if (!result) {
NSLog(@"删除数据失败!\n");
} else {
NSLog(@"删除数据成功!\n");
}
[database close];
} else {
NSLog(@"打开数据库失败!\n");
}
}
遍历数据库
- (void)ergodicData { //遍历数据库
NSInteger page = self.scrollView.contentOffset.x / W;
FMDatabase* database = [FMDatabase databaseWithPath:self.path];
if([database open]) {
FMResultSet *resultSet = [database executeQuery:@"SELECT * FROM t_collection"];
while ([resultSet next]) {
if([[resultSet stringForColumn:@"title"] isEqualToString:title]) {
NSLog(@"存在此内容");
}
}
[database close];
} else {
NSLog(@"打开数据库失败!\n");
}
}