美文网首页数据处理安全数据本地化收藏ios
使用第三方类库FMDB封装数据请求类,实现数据分页请求,上拉刷新

使用第三方类库FMDB封装数据请求类,实现数据分页请求,上拉刷新

作者: 何年何月 | 来源:发表于2016-09-09 08:54 被阅读750次

    使用第三方类库FMDB封装数据请求类,实现数据分页请求,上拉刷新下拉加载####

    • 实现功能:添加问题和答案,删除问题,查询问题
    • 实现方法:使用SQLite,建三个键值letter(大写字母)、question(问题)、answer(答案)。

    FMDBDataBase.h代码如下:

    @class QuestionsAndAnswers;
    
    @interface FMDBDataBase : NSObject
    singleton_interface(FMDBDataBase)
    
    //打开数据库
    - (void)openDataBase;
    
    //关闭数据库
    - (void)closeDataBase;
    
    //增
    - (void)insertData:(QuestionsAndAnswers *)QuestionsAndAnswers;
    
    // 加强版增加
    - (void)insertData:(QuestionsAndAnswers * _Nonnull)questionsandanswers
               success:(nullable void (^)(id _Nullable responseObject))success
               failure:(nullable void (^)(id _Nullable errorObject))failure
         fromClassName:(NSString * _Nonnull)className;
    
    
    
    
    //删
    - (void)deleteData:(NSString *)question;
    
    // 删除增强版
    - (void)deleteData:(NSString *_Nonnull)question
               success:(nullable void (^)(id _Nullable responseObject))success
               failure:(nullable void (^)(id _Nullable errorObject))failure
         fromClassName:(NSString * _Nonnull)className;
    
    //查
    - (NSArray *)queryData;
    
    // 查询增强版
    - (void)queryDataWithPram:(NSDictionary *_Nonnull)dict
                      success:(nullable void (^)(id _Nullable responseObject))success
                      failure:(nullable void (^)(id _Nullable errorObject))failure
                fromClassName:(NSString * _Nonnull)className;
    
    //改
    //- (void)updateData:(NSString *)question name:(NSString *)answer;
    
    

    FMDBDataBase.m代码如下:

    #import "QuestionsAndAnswers.h"
    
    @implementation FMDBDataBase
    singleton_implementation(FMDBDataBase)
    
    
    
    //创建数据库对象
    static FMDatabase *db = nil;
    
    //打开数据库
    - (void)openDataBase{
        
        //创建文件路径
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        documentPath = [documentPath stringByAppendingString:@"/questionsandanswers.sqlite"];
        NSLog(@"%@",documentPath);
        
        //创建数据库
        db = [FMDatabase databaseWithPath:documentPath];
        
        //打开数据库,并判断是否打开了数据库 open 的返回类型是BOOL
        if ([db open]) {
            
            NSLog(@"数据库打开成功");
            
            NSString *sql = @"CREATE TABLE IF NOT EXISTS questionsandanswers (question_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE, letter TEXT NOT NULL, question TEXT NOT NULL, answer TEXT NOT NULL)";
            BOOL result = [db executeUpdate:sql];
            if (result) {
                NSLog(@"创表成功");
            [KVNProgress showSuccessWithStatus:@"打开数据库并创建表成功"];
    
            }else{
                NSLog(@"创表失败");
            }
            
            
        }else{
            NSLog(@"数据库打开失败");
        }
        
    }
    
    
    //关闭数据库
    - (void)closeDataBase{
        //关闭数据库
        NSLog(@"关闭数据库");
        [db close];
        
    }
    
    //增
    - (void)insertData:(QuestionsAndAnswers *)questionsandanswers{
        
        [db open];
        
        NSMutableArray *array = [NSMutableArray array];
        
        FMResultSet *set = [db executeQuery:@"select *from questionsandanswers"];
        while ([set next]) {
            
            NSString *question = [set stringForColumn:@"question"];
            
            NSLog(@"%@",question);
            [array addObject:question];
        }
        
        // 如果数据库已经包含了这条数据,就不增加
        if ([array containsObject:questionsandanswers.question]) {
            return;
        }else{
             // 获取问题的拼音
            NSString *str = [FMDBDataBase transform:questionsandanswers.question]; 
            str = [str substringToIndex:1];
            NSString *letter = [str uppercaseString]; // 取拼音的首字符大写
            
            NSLog(@"首字母:%@,问题:%@,答案:%@",letter,questionsandanswers.question,questionsandanswers.answer);
            
            [db executeUpdate:@"insert into questionsandanswers (letter,question,answer) values(?,?,?)",letter,questionsandanswers.question,questionsandanswers.answer];
        }
        
        
        
        
    }
    
    // 加强版增加
    - (void)insertData:(QuestionsAndAnswers * _Nonnull)questionsandanswers
               success:(nullable void (^)(id _Nullable responseObject))success
               failure:(nullable void (^)(id _Nullable errorObject))failure
         fromClassName:(NSString * _Nonnull)className{
        
        
        BOOL openData = [db open];
        if (openData) {
            
            NSMutableArray *array = [NSMutableArray array];
            
            FMResultSet *set = [db executeQuery:@"select *from questionsandanswers"];
            while ([set next]) {
                
                NSString *question = [set stringForColumn:@"question"];
                
                NSLog(@"%@",question);
                [array addObject:question];
            }
                
            if ([array containsObject:questionsandanswers.question]) {
                if (failure) {
                    
                    failure(@"数据库中此问题已存在!");
                }
                return;
            }else{
                NSString *str = [FMDBDataBase transform:questionsandanswers.question];
                str = [str substringToIndex:1];
                NSString *letter = [str uppercaseString];
                
                NSLog(@"首字母:%@,问题:%@,答案:%@",letter,questionsandanswers.question,questionsandanswers.answer);
                
                BOOL suc = [db executeUpdate:@"insert into questionsandanswers (letter,question,answer) values(?,?,?)",letter,questionsandanswers.question,questionsandanswers.answer];
                
                if (suc) {
                    if (success) {
                        
                        NSDictionary *dict = @{@"status":@"0",@"info":@"数据添加成功!"};
                        
                        NSLog(@"%@\\n传参:%@\\n回参:%@", className, questionsandanswers,dict);
    
                        success(dict);
    
                    }
                    
                }else{
                    
                    if (success) {
                        
                        NSDictionary *dict = @{@"status":@"1",@"msg":@"数据添加失败!"};
                        NSLog(@"%@\\n传参:%@\\n回参:%@", className, questionsandanswers,dict);
    
                        success(dict);
                        
                    }
     
                }
            }
            
            
        }else{
            
            if (failure) {
                
                failure(@"打开数据库失败!");
    
            }
        }
    }
    
    
    
    
    //删
    - (void)deleteData:(NSString *)question{
        
        [db open];
        
        [db executeUpdate:@"delete from questionsandanswers where question = ?",question];
        
        
    }
    
    - (void)deleteData:(NSString *_Nonnull)question
               success:(nullable void (^)(id _Nullable responseObject))success
               failure:(nullable void (^)(id _Nullable errorObject))failure
         fromClassName:(NSString * _Nonnull)className{
        
        BOOL openData = [db open];
        if (openData) {
            
            BOOL suc = [db executeUpdate:@"delete from questionsandanswers where question = ?",question];
            
            if (suc) {
                if (success) {
                    
                    NSDictionary *dict = @{@"status":@"0",@"info":@"数据删除成功!"};
                    
                    NSLog(@"%@\\n传参:%@\\n回参:%@", className, question,dict);
                    
                    success(dict);
                    
                }
                
            }else{
                
                if (success) {
                    
                    NSDictionary *dict = @{@"status":@"1",@"msg":@"数据删除失败!"};
                    NSLog(@"%@\\n传参:%@\\n回参:%@", className, question,dict);
                    
                    success(dict);
                    
                }
                
            }
    
            
        }else{
            
            if (failure) {
                
                failure(@"打开数据库失败!");
                
            }
        }
    
    }
    
    //查
    - (NSArray *)queryData{
        
        [db open];
        NSMutableArray *array = [NSMutableArray array];
        
        FMResultSet *set = [db executeQuery:@"select *from questionsandanswers"];
        while ([set next]) {
            QuestionsAndAnswers *questionsandanswers = [QuestionsAndAnswers new];
            
            questionsandanswers.letter = [set stringForColumn:@"letter"];
            questionsandanswers.question = [set stringForColumn:@"question"];
            questionsandanswers.answer = [set stringForColumn:@"answer"];
            
    //        NSLog(@"%@",questionsandanswers);
            [array addObject:questionsandanswers];
        }
        
        return array;
        
    }
    
    // 增强版查询数据,添加了分页,一页10条数据
    - (void)queryDataWithPram:(NSDictionary *_Nonnull)dict
                      success:(nullable void (^)(id _Nullable responseObject))success
                      failure:(nullable void (^)(id _Nullable errorObject))failure
                fromClassName:(NSString * _Nonnull)className{
        
        BOOL openData = [db open];
        if (openData) {
            
            
            NSMutableArray *array = [NSMutableArray array];
            NSMutableArray *allArray = [NSMutableArray array];
            
            FMResultSet *set = [db executeQuery:@"select *from questionsandanswers"];
            
            while ([set next]) {
                
                NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
                
                [dictionary setObject:[set stringForColumn:@"letter"] forKey:@"letter"];
                [dictionary setObject:[set stringForColumn:@"question"] forKey:@"question"];
                [dictionary setObject:[set stringForColumn:@"answer"] forKey:@"answer"];
                
                [allArray addObject:dictionary];
            }
            
            NSInteger allData = allArray.count;
            
            for (int i = 0; i < allData; i++) {
                
                NSInteger num = 10*[dict[@"page"] integerValue];
             // 返回的数据要小于分页数据
                if (array.count >= num) {
                    
                    break;
                }
                
                [array addObject:allArray[i]];
                
            }
            
            NSInteger arrayCount = array.count;
            // 当查询到所有数据之后的操作
            if (array.count == allData) {
                
                if (failure) {
                    
                    failure(@"没有更多数据啦!");
                }
            }
    
    //        while ([set next]) {
    //            
    //            NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    ////            QuestionsAndAnswers *questionsandanswers = [QuestionsAndAnswers new];
    ////            questionsandanswers.letter = [set stringForColumn:@"letter"];
    ////            questionsandanswers.question = [set stringForColumn:@"question"];
    ////            questionsandanswers.answer = [set stringForColumn:@"answer"];
    //
    //            [dictionary setObject:[set stringForColumn:@"letter"] forKey:@"letter"];
    //            [dictionary setObject:[set stringForColumn:@"question"] forKey:@"question"];
    //            [dictionary setObject:[set stringForColumn:@"answer"] forKey:@"answer"];
    //
    //            
    //            
    //            NSInteger num = 10*[dict[@"page"] integerValue];
    //            if (array.count >= num) {
    //                
    //                break;
    //            }
    //            
    //            [array addObject:dictionary];
    //
    //        }
            
            BOOL countMoreZero = array.count;
            
            if (countMoreZero) {
                // 拼接数据返回
                if (success) {
                    
                    NSMutableDictionary *responseOb = [NSMutableDictionary dictionary];
                    [responseOb setObject:@"0" forKey:@"status"];
                    [responseOb setObject:array forKey:@"info"];
                    [responseOb setObject:[NSString stringWithFormat:@"%ld",allData] forKey:@"allData"];
                    
                    NSLog(@"%@\\n传参:%@\\n回参:%@", className, dict,responseOb);
                    success(responseOb);
     
                }
                
            }else{
                
                if (success) {
                    
                    NSDictionary *responseOb = @{@"status":@"1",@"msg":@"数据库没有数据!"};
                    
                    NSLog(@"%@\\n传参:%@\\n回参:%@", className, dict,responseOb);
    
                    success(responseOb);
    
                }
            }
            
            
            
        }else{
            
            if (failure) {
                
                failure(@"打开数据库失败!");
                
            }
        }
    
        
    }
    
    
    
    // 汉字转拼音
    + (NSString *)transform:(NSString *)chinese{
        //将NSString装换成NSMutableString
        NSMutableString *pinyin = [chinese mutableCopy];
        //将汉字转换为拼音(带音标)
        CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformMandarinLatin, NO);
        NSLog(@"%@", pinyin);
        //去掉拼音的音标
        CFStringTransform((__bridge CFMutableStringRef)pinyin, NULL, kCFStringTransformStripCombiningMarks, NO);
        NSLog(@"%@", pinyin);
        //返回最近结果
        return pinyin;
    }
    

    使用起来和AFNetWorking类似####

    分页刷新

    
    
    // 数据刷新
    @property (assign, nonatomic) NSInteger page;
    @property (assign, nonatomic) NSInteger totalNum;
    @property (assign, nonatomic) NSInteger from;
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
        NSLog(@"%@",documentPath);
        
        self.from = 1;    
        self.dataArray = [NSMutableArray array];        
        
        
        // 打开数据库
        [[FMDBDataBase sharedFMDBDataBase] openDataBase];
        
        [self layoutViews];
    
    }
    
    
    #pragma mark--------刷新--------
    - (void)loadNewData
    {
        self.page = self.from;
        [self loadData];
    }
    // 加载更多数据
    - (void)loadMoreData
    {
        
        self.page++;
        
        [self loadData];
    }
    
    - (void)loadData
    {
        
        NSDictionary *dict = @{@"page":[NSString stringWithFormat:@"%ld",self.page]};
        
        [[FMDBDataBase sharedFMDBDataBase] queryDataWithPram:dict success:^(id  _Nullable responseObject) {
            
            if ([responseObject[@"status"] isEqualToString:@"0"]) {
                
    //            if ([self.showTableView.mj_header isRefreshing]) {
    //                
    //                [self.dataArray removeAllObjects];
    //            }
                
                NSMutableArray *shoArr = [NSMutableArray array];
                
                self.totalNum = [responseObject[@"allData"] integerValue];
                
                NSArray *array = responseObject[@"info"];
                
                for (NSDictionary *dicc in array) {
                    
                    QuestionsAndAnswers *questAnser = [[QuestionsAndAnswers alloc]initWithDictionary:dicc];
                    
                    if (shoArr.count >= self.totalNum) {
                        
                        break;
                    }
                    
                    [shoArr addObject:questAnser];
    
                }
                
                NSLog(@"dataArray:%@",self.dataArray);
                self.dataArray = shoArr;
                [self.showTableView reloadData];
                [self.showTableView.mj_header endRefreshing];
                [self.showTableView.mj_footer endRefreshing];
    
                
            }else{
                
                [KVNProgress showErrorWithStatus:responseObject[@"msg"]];
                [self.showTableView.mj_header endRefreshing];
                [self.showTableView.mj_footer endRefreshing];
    
            }
            
        } failure:^(id  _Nullable errorObject) {
            
            [KVNProgress showErrorWithStatus:errorObject];
            [self.showTableView.mj_header endRefreshing];
            [self.showTableView.mj_footer endRefreshing];
    
        } fromClassName:NSStringFromClass([self class])];
    }
    
    - (void)setTotalNum:(NSInteger)totalNum
    {
        _totalNum = totalNum;
        
        if (self.dataArray.count >= _totalNum) {
            
            [self.showTableView.mj_footer endRefreshingWithNoMoreData];
            
        }
        else
            [self.showTableView.mj_footer resetNoMoreData];
    }
    
    
    - (void)layoutViews{
        
        self.showTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 64, k_width, k_height-64) style:UITableViewStylePlain];
        [self.view addSubview:self.showTableView];
        self.showTableView.delegate = self;
        self.showTableView.dataSource = self;
        
        [self.view addSubview:self.showTableView];
        
        self.showTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(loadNewData)];
        self.showTableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingTarget:self refreshingAction:@selector(loadMoreData)];
    
        [self.showTableView.mj_header beginRefreshing];
        
        
        }
    

    工程下载###

    工程demo下载地址

    相关文章

      网友评论

        本文标题:使用第三方类库FMDB封装数据请求类,实现数据分页请求,上拉刷新

        本文链接:https://www.haomeiwen.com/subject/xjjeettx.html