zoukankan      html  css  js  c++  java
  • 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;
    }
    将来的自己,会感谢现在不放弃的自己!
  • 相关阅读:
    [android] add system services
    java layer调用native层的android_media_AudioTrack_get_min_buff_size()确定audio track buffer的min size
    [转]linux 系统 errno.h错误码
    java static final泛型类对象
    Linux--信号阻塞与屏蔽
    02-CSS基础与进阶-day2_2018-08-27-20-34-56
    02-CSS基础与进阶-day2_2018-08-27-20-15-54
    69期-Java SE-001_Java概述-001-002
    02-CSS基础与进阶-day1-录像296
    02-CSS基础与进阶-day1-录像295
  • 原文地址:https://www.cnblogs.com/TheYouth/p/6657004.html
Copyright © 2011-2022 走看看