FMDB的初体验及离线缓存
一、FMDB的简单使用
1、代码实例
1、准备工作
需要导入sqlite3框架,下载fmdb类库
2、打开数据库与创建表
//2.1存取的沙盒路径
NSString *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
NSString *filePath = [cache stringByAppendingPathComponent:@"class.sqlite"];
//2.2打开数据库
FMDatabase *base =[FMDatabase databaseWithPath:filePath];
if([base open]){
NSLog(@"打开成功");
}else{
NSLog(@"打开失败");
}
//2.3创建表
NSString *sql = @"create table if not exists t_students (id integer primary key autoincrement,name text ,age integer,height real)";
BOOL flag = [base executeUpdate:sql];
if (flag) {
NSLog(@"创建表成功");
}else{
NSLog(@"创建表失败");
}
_dataBase = base; //赋值全局变量
3、凡是增、删、改都行executeUpdate执行语句。
4、插入数据
//插入数据,注意当数据为整型或浮点型时,必须转换成NSNumber类型的,@(),包含起来
for (NSInteger i = 0; i< 10; i++) {
NSString *name = [NSString stringWithFormat:@"TheYouth%ld",i];
NSInteger age = [[NSString stringWithFormat:@"%ld",i+20] integerValue];
float height = [[NSString stringWithFormat:@"%.1f",i+0.5] floatValue];
BOOL isflag = [_dataBase executeUpdate:@"insert into t_students (name,age,height) values (?,?,?)",name,@(age),@(height)];
if (isflag) {
NSLog(@"插入表成功");
}else{
NSLog(@"插入表失败");
}
}
5、删除数据
BOOL isflag = [_dataBase executeUpdate:@"delete from t_students where age > 25"];
if (isflag) {
NSLog(@"删除成功");
}else{
NSLog(@"删除失败");
}
6、修改数据
BOOL isflag = [_dataBase executeUpdate:@"update t_students set age = 3.8,name='xingZai' where height < 3.5"];
if (isflag) {
NSLog(@"修改成功");
}else{
NSLog(@"修改失败");
}
7、查询数据
FMResultSet *result = [_dataBase executeQuery:@"select * from t_students"];
while ([result next]) { //执行符合条件的下一行
NSString *name = [result stringForColumnIndex:1]; //取出字符型属性
NSInteger age = [result intForColumnIndex:2]; //取出整型
CGFloat height = [result doubleForColumnIndex:3]; //取出浮点型数据
NSLog(@"%@,%ld,%.1f",name,age,height);
}
二、FMDB多线程与事务
1、代码实例
//1.创建数据库,打开表
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//设置路径
NSString *filePath = [cachePath stringByAppendingPathComponent:@"student.sqlite"];
// 创建数据库实例
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:filePath];
_queue = queue;
// 创建数据库表
// 提供了一个多线程安全的数据库实例
[queue inDatabase:^(FMDatabase *db) {
BOOL flag = [db executeUpdate:@"create table if not exists t_student (id integer primary key autoincrement,name text,money integer)"];
if (flag) {
NSLog(@"success");
}else{
NSLog(@"failure");
}
}];
//2.插入数据
[_queue inDatabase:^(FMDatabase *db) {
BOOL flag = [db executeUpdate:@"insert into t_student (name,money) values (?,?)",@"a",@100];
if (flag) {
NSLog(@"success");
}else{
NSLog(@"failure");
}
[db executeUpdate:@"insert into t_student (name,money) values (?,?)",@"b",@50];
}];
//3.删除所有数据
[_queue inDatabase:^(FMDatabase *db) {
BOOL flag = [db executeUpdate:@"delete from t_user;"];
if (flag) {
NSLog(@"success");
}else{
NSLog(@"failure");
}
}];
//4.开启一个事务,来处理多线程的问题,必须全部处理完才能结束(成功),否则失败,然后回滚到原始状态
[_queue inDatabase:^(FMDatabase *db) {
// 开启事务
[db beginTransaction];
BOOL flag = [db executeUpdate:@"update t_user set money = ? where name = ?;",@500,@"a"];
if (flag) {
NSLog(@"success");
}else{
NSLog(@"failure");
// 回滚
[db rollback];
}
BOOL flag1 = [db executeUpdate:@"updat t_user set money = ? where name = ?;",@1000,@"b"];
if (flag1) {
NSLog(@"success");
}else{
NSLog(@"failure");
[db rollback];
}
// 全部操作完成时候再去
[db commit];
}];
三、FMDB处理离线缓存
1、思维导图

2、代码实例
以微博数据为例
1、保存数据
+ (void)saveWithStatuses:(NSArray *)statuses
{//取出数据
// 遍历模型数组
for (NSDictionary *statusDict in statuses) {//遍历数组中的每个字典
NSString *idstr = statusDict[@"idstr"]; //存取idstr,为了之后取数据
NSString *accessToken = [CZAccountTool account].access_token; //存取用户token
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:statusDict]; //存取字典数据,转换成二进制流
BOOL flag = [_db executeUpdate:@"insert into t_status (idstr,access_token,dict) values(?,?,?)",idstr,accessToken,data];//插入数据,字段有idstr,用户token,原始数据字典
if (flag) {
NSLog(@"插入成功");
}else{
NSLog(@"插入失败");
}
}
}
//2.存数据库中取数据,param状态模型,要不需要传很多参数
+ (NSArray *)statusesWithParam:(CZStatusParam *)param
{
// 进入程序第一次获取的查询语句
NSString *sql = [NSString stringWithFormat:@"select * from t_status where access_token = '%@' order by idstr desc limit 20;",param.access_token];
if (param.since_id) { // 获取最新微博的查询语句
sql = [NSString stringWithFormat:@"select * from t_status where access_token = '%@' and idstr > '%@' order by idstr desc limit 20;",param.access_token,param.since_id];
}else if (param.max_id){ // 获取更多微博的查询语句
sql = [NSString stringWithFormat:@"select * from t_status where access_token = '%@' and idstr <= '%@' order by idstr desc limit 20;",param.access_token,param.max_id];
}
FMResultSet *set = [_db executeQuery:sql];
NSMutableArray *arrM = [NSMutableArray array];
while ([set next]) {
NSData *data = [set dataForColumn:@"dict"];
NSDictionary *dict = [NSKeyedUnarchiver unarchiveObjectWithData:data];
CZStatus *s = [CZStatus objectWithKeyValues:dict];
[arrM addObject:s];
}
return arrM;
}
将来的自己,会感谢现在不放弃的自己!

浙公网安备 33010602011771号