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

使用第三方类库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下载地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,444评论 25 707
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 今天爸爸带读的小怪物系列。虽然爸爸英语读的不流利,但是还是坚持英文读。精神可嘉,我问芒果听懂了吗,芒果点头。不过就...
    爱跳舞的加菲怂阅读 83评论 0 0
  • 在大多数人眼中我是什么呢?一个无用的人,一个反常与讨厌的人,一个没有社会地位,而且永远夜不会有社会地位的人。 好极...
    执着的麦子阅读 1,835评论 0 0
  • 人到三十,没有貌美的容颜,身材走样,没有技术,没有工作,老公嫌弃,朋友越来越远,不想父母担心,走到父母家附近不敢进...
    Alise的新生活阅读 165评论 1 0