// // RQQuestionDBManager.m // SDJK // // Created by 张嵘 on 2021/8/20. // #import "RQQuestionDBManager.h" static NSString *dbNameStr = @"question"; static NSString *dbTypeStr = @"db"; static NSString *questionTableNameStr = @"question_info"; @interface RQQuestionDBManager () @property (nonatomic, readwrite, strong) FMDatabaseQueue *databaseQueue; @end @implementation RQQuestionDBManager static id rq_questionDBManager = nil; #pragma mark - init + (instancetype)sharedInstance { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ rq_questionDBManager = [[self alloc] init]; }); return rq_questionDBManager; } - (instancetype)init { if (self = [super init]) { NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"question" ofType:@"db"]; [self initDatabaseQueueWithResourcePath:resourcePath]; } return self; } - (void)initDatabaseQueueWithResourcePath:(NSString *)resourcePath { NSError *error; NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"question.db"]]; if ([RQFileManager isPathExist:dbPath]) { self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath]; NSLog(@"数据库path-----%@",dbPath); if ([self getQuestionVersion] >= [self getQuestionVersionWithResourcePath:resourcePath]) { } else { [[RQFileManager fileManager] removeItemAtPath:dbPath error:&error]; [[RQFileManager fileManager] copyItemAtPath:resourcePath toPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"question.db"]] error:&error]; self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath]; } } else { [[RQFileManager fileManager] copyItemAtPath:resourcePath toPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"question.db"]] error:&error]; self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath]; NSLog(@"数据库path-----%@",dbPath); } } #pragma mark - Public Method - (NSArray *)getColumnWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject pageType:(RQHomeSubPageType)pageType { /// 默认为轿车 cart,bus,truck NSString *queryCarTypeStr = @"model LIKE '%cart%'"; switch (carType) { case RQHomePageCarType_Car: queryCarTypeStr = @"model LIKE '%cart%'"; break; case RQHomePageCarType_Bus: queryCarTypeStr = @"model LIKE '%bus%'"; break; case RQHomePageCarType_Truck: queryCarTypeStr = @"model LIKE '%truck%'"; break; case RQHomePageCarType_Motorcycle: queryCarTypeStr = @"model LIKE '%mtc%'"; break; default: break; } /// 默认科目一 NSString *querySubjectTypeStr = @"k1"; switch (subject) { case RQHomePageSubjectType_SubjectOne: querySubjectTypeStr = @"k1"; break; case RQHomePageSubjectType_SubjectTwo: querySubjectTypeStr = @"k2"; break; case RQHomePageSubjectType_SubjectThree: querySubjectTypeStr = @"k3"; break; case RQHomePageSubjectType_SubjectFour: querySubjectTypeStr = @"k4"; break; default: break; } /// 默认顺序练习 NSString *pageTypeStr = @"title"; NSString *pageTypeByOrderStr = @"sort"; switch (pageType) { case RQHomeSubPageType_SequentialPractice:/// 顺序练习 pageTypeStr = @"title,column_id"; pageTypeByOrderStr = @"sort"; querySubjectTypeStr = [NSString stringWithFormat:@"subject = '%@'",querySubjectTypeStr]; break; case RQHomeSubPageType_LocalTopics: /// 地方专题 pageTypeStr = @"title,column_id"; pageTypeByOrderStr = @"sort"; querySubjectTypeStr = [NSString stringWithFormat:@"%@_4",querySubjectTypeStr]; querySubjectTypeStr = [NSString stringWithFormat:@"subject = '%@'",querySubjectTypeStr]; break; case RQHomeSubPageType_ClassificationExercise:/// 分类练习 pageTypeStr = @"title,column_id"; pageTypeByOrderStr = @"sort"; querySubjectTypeStr = [NSString stringWithFormat:@"%@_3",querySubjectTypeStr]; querySubjectTypeStr = [NSString stringWithFormat:@"subject = '%@'",querySubjectTypeStr]; break; case RQHomeSubPageType_SelectedTestQuestions: //精选考题 pageTypeStr = @"title,column_id"; pageTypeByOrderStr = @"sort"; querySubjectTypeStr = [NSString stringWithFormat:@"%@_2",querySubjectTypeStr]; querySubjectTypeStr = [NSString stringWithFormat:@"subject = '%@'",querySubjectTypeStr]; break; default: break; } //v1.1.2 旧逻辑 // NSString *queryStr = [NSString stringWithFormat:@"select distinct %@ from question_info where %@ and %@ %@ order by %@ + 0 ASC", pageTypeStr, queryCarTypeStr, querySubjectTypeStr, (pageType == RQHomeSubPageType_LocalTopics)? @"and place_issue IS NOT NULL" : @"", pageTypeByOrderStr]; //v1.1.3 NSString *queryStr = [NSString stringWithFormat:@"select distinct %@ from question_column where %@ and %@ order by %@ + 0 ASC", pageTypeStr, queryCarTypeStr, querySubjectTypeStr, pageTypeByOrderStr]; // select distinct * from WHERE subject = 'k1_2' AND model LIKE '%cart%' order by sort ASC NSMutableArray *arr = @[].mutableCopy; @weakify(arr) [_databaseQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { @try { @strongify(arr) FMResultSet *resultSet = [db executeQuery:queryStr]; while ([resultSet next]) { if([pageTypeStr containsString:@","]){ NSString *str = [resultSet stringForColumn:@"title"]; NSString *strCol = [resultSet stringForColumn:@"column_id"]; NSString *str_title = [NSString stringWithFormat:@"%@,%@",str,strCol]; // 对应字段来取数据 [arr addObject:str_title? : @"地方题"]; }else{ NSString *str = [resultSet stringForColumn:pageTypeStr]; // 对应字段来取数据 [arr addObject:str? : @"地方题"]; } } if ([arr containsObject:@"地方题"] && [arr indexOfObject:@"地方题"] == 0) { NSString *saveStr = arr.firstObject; [arr removeFirstObject]; [arr addObject:saveStr]; } } @catch (NSException *exception) { *rollback = YES; } @finally { *rollback = NO; } }]; return arr.copy; } - (NSArray *)getQuestionWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject pageType:(RQHomeSubPageType)pageType name:(NSString *)name exerciseType:(RQExerciseType)exerciseType { NSMutableArray *arr = @[].mutableCopy; /// 默认为轿车 cart,bus,truck NSString *queryCarTypeStr = @"model LIKE '%cart%'"; NSString *carTypeStr = @"cart"; switch (carType) { case RQHomePageCarType_Car: queryCarTypeStr = @"model LIKE '%cart%'"; carTypeStr = @"cart"; break; case RQHomePageCarType_Bus: queryCarTypeStr = @"model LIKE '%bus%'"; carTypeStr = @"bus"; break; case RQHomePageCarType_Truck: queryCarTypeStr = @"model LIKE '%truck%'"; carTypeStr = @"truck"; break; case RQHomePageCarType_Motorcycle: queryCarTypeStr = @"model LIKE '%mtc%'"; break; default: break; } /// 默认科目一 NSString *querySubjectTypeStr = @"subject = 1"; NSString *subjectTypeStr = @"1"; switch (subject) { case RQHomePageSubjectType_SubjectOne: querySubjectTypeStr = @"subject = 1"; subjectTypeStr = @"1"; break; case RQHomePageSubjectType_SubjectTwo: querySubjectTypeStr = @"subject = 2"; subjectTypeStr = @"2"; break; case RQHomePageSubjectType_SubjectThree: querySubjectTypeStr = @"subject = 3"; subjectTypeStr = @"3"; break; case RQHomePageSubjectType_SubjectFour: querySubjectTypeStr = @"subject = 4"; subjectTypeStr = @"4"; break; default: break; } /// 默认顺序练习 // NSString *pageTypeStr = @"seque_issue_name"; // NSString *pageTypeByOrderStr = @"seque_issue"; NSString *nameStr = @""; NSString *orderStr = @""; NSString *colidStr = @""; if([name containsString:@","]){ colidStr = [[name componentsSeparatedByString:@","] lastObject]; } switch (pageType) { //// pageTypeStr = @"place_issue_name"; //// pageTypeByOrderStr = @"place_issue"; // nameStr = [NSString stringWithFormat:@"and place_issue_name = '%@'",name]; // orderStr = @"number"; // break; case RQHomeSubPageType_LocalTopics: case RQHomeSubPageType_ClassificationExercise: case RQHomeSubPageType_SequentialPractice: case RQHomeSubPageType_SelectedTestQuestions: // pageTypeStr = @"excell_issue_name"; // pageTypeByOrderStr = @"excell_issue"; nameStr = [NSString stringWithFormat:@"(INSTR ( column_all, ',' || '%@' || ',' ) > 0 OR INSTR ( column_all, '%@' || ',' ) = 1 OR INSTR ( column_all, ',' || '%@' ) = ( length( column_all ) - length( ',' || '%@' ) ) + 1 OR column_all = '%@')",colidStr,colidStr,colidStr,colidStr,colidStr]; orderStr = @"number"; break; default: break; } if (RQStringIsEmpty(name)) { nameStr = @""; } /// excell_sort /// 默认按_id排序 NSString *exerciseTypeStr = [NSString stringWithFormat:@"%@ + 0 ASC", orderStr]; switch (exerciseType) { case RQExerciseType_Sequential: // exerciseTypeStr = [NSString stringWithFormat:@"%@ + 0 ASC", orderStr]; break; case RQExerciseType_Random: // exerciseTypeStr = @"random()"; break; case RQExerciseType_Recitation: // exerciseTypeStr = [NSString stringWithFormat:@"%@ + 0 ASC", orderStr]; break; case RQExerciseType_Test: // exerciseTypeStr = @"random() limit 50"; break; case RQExerciseType_Exam: // exerciseTypeStr = @"random() limit 5"; break; default: break; } // resultSet = [_db executeQuery:@"select * from question_info where answer like '%-%'"]; NSString *queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ order by %@", queryCarTypeStr, nameStr, exerciseTypeStr]; @weakify(queryStr) if (pageType == RQHomeSubPageType_MockExamination && exerciseType == RQExerciseType_Test) { NSString *excellIssueNameStr = (carType == RQHomePageCarType_Motorcycle)? @"" : @"AND excell_issue_name LIKE '%%必%%'"; NSString *newExcellIssueNameStr = (carType == RQHomePageCarType_Motorcycle)? @"" : @"AND excell_issue_name LIKE '%%新%%'"; RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { @strongify(queryStr) queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 1 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, excellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_Judgment isNew:NO]]; [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]]; [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ }]; }]; RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { @strongify(queryStr) queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 1 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, newExcellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_Judgment isNew:YES]]; [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]]; [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ }]; }]; RACSignal *signal3 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { @strongify(queryStr) queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 2 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, excellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_SingleChoice isNew:NO]]; [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]]; [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ }]; }]; RACSignal *signal4 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { @strongify(queryStr) queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 2 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, newExcellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_SingleChoice isNew:YES]]; [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]]; [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ }]; }]; RACSignal *signal5 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { @strongify(queryStr) queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 3 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, excellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_MultipleChoice isNew:NO]]; [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]]; [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ }]; }]; RACSignal *signal6 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { @strongify(queryStr) queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ and question_type = 3 and place_issue IS NULL %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, newExcellIssueNameStr, [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_MultipleChoice isNew:YES]]; [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]]; [subscriber sendCompleted]; return [RACDisposable disposableWithBlock:^{ }]; }]; RACSignal *signal = [RACSignal combineLatest:@[signal1, signal2, signal3, signal4, signal5, signal6] reduce:^id (NSArray *arr1, NSArray *arr2, NSArray *arr3, NSArray *arr4, NSArray *arr5, NSArray *arr6) { NSMutableArray *judgmentArr = @[].mutableCopy; [judgmentArr addObjectsFromArray:arr1]; [judgmentArr addObjectsFromArray:arr2]; judgmentArr = [judgmentArr rq_randomArray].mutableCopy; NSMutableArray *singleChoiceArr = @[].mutableCopy; [singleChoiceArr addObjectsFromArray:arr3]; [singleChoiceArr addObjectsFromArray:arr4]; singleChoiceArr = [singleChoiceArr rq_randomArray].mutableCopy; NSMutableArray *multipleChoiceArr = @[].mutableCopy; [multipleChoiceArr addObjectsFromArray:arr5]; [multipleChoiceArr addObjectsFromArray:arr6]; multipleChoiceArr = [multipleChoiceArr rq_randomArray].mutableCopy; [arr addObjectsFromArray:judgmentArr]; [arr addObjectsFromArray:singleChoiceArr]; [arr addObjectsFromArray:multipleChoiceArr]; return arr.copy; }]; [signal subscribeNext:^(NSArray *allArr) { }]; return arr.copy; } else if (pageType == RQHomeSubPageType_MockExamination && exerciseType == RQExerciseType_Exam) { @weakify(self) RACSignal *signal0 = [RQ_HTTP_Service getSelectTestK14QuestionInfoList:carTypeStr subject:subjectTypeStr]; [[signal0 takeUntil:self.rac_willDeallocSignal] subscribeNext:^(NSArray *array) { NSLog(@"%@",array); } error:^(NSError * _Nullable error) { }]; RACSignal *signal = [RACSignal combineLatest:@[signal0] reduce:^id (NSArray *arr1) { NSLog(@"signal0=========%@",arr1); [arr addObjectsFromArray:arr1]; return arr.copy; }]; [signal subscribeNext:^(NSArray *allArr) { }]; return arr.copy; // RACSignal *signal0 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { // @strongify(self) // NSMutableArray *difficultArr = @[].mutableCopy; // //// [[[self getExamRuleWithCarType:carType subject:subject].rac_sequence.signal map:^id _Nullable(RQExamRuleModel *examRuleModel) { //// NSString *chapterIdStr = [NSString stringWithFormat:@"chapter_id = %ld",(long)examRuleModel.chapter_id]; //// NSString *typeStr = [NSString stringWithFormat:@"question_type IN %@",(subject == RQHomePageSubjectType_SubjectOne)? @"(1, 2)" : @"(1, 2, 3)"]; //// NSString *randomStr = [NSString stringWithFormat:@"RANDOM() LIMIT %@",[NSString qmui_stringWithNSInteger:examRuleModel.difficult_count]]; //// NSString *difficultQueryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND diff_degree IN (4, 5) AND place_issue IS NULL AND %@ AND %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, typeStr, randomStr]; //// return difficultQueryStr; //// }].toArray.rac_sequence.signal subscribeNext:^(NSString *difficultQueryStr) { //// @strongify(self) //// [difficultArr addObjectsFromArray:[self queryQuestionWithQueryStr:difficultQueryStr]]; //// } completed:^{ //// [subscriber sendNext:difficultArr.copy]; //// [subscriber sendCompleted]; //// }]; // return [RACDisposable disposableWithBlock:^{}]; // }]; // RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { // NSMutableArray *judgeArr = @[].mutableCopy; // [[[self getExamRuleWithCarType:carType subject:subject].rac_sequence.signal map:^id _Nullable(RQExamRuleModel *examRuleModel) { // NSString *chapterIdStr = [NSString stringWithFormat:@"AND chapter_id = %ld",(long)examRuleModel.chapter_id]; // NSString *judgeCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)examRuleModel.judge_count]; // NSString *judgeQueryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND question_type = 1 AND diff_degree IN (0,1,2,3) AND place_issue IS NULL %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, judgeCountStr]; // NSMutableArray *judgeChapterArr = [self queryQuestionWithQueryStr:judgeQueryStr].mutableCopy; // if (judgeChapterArr.count < examRuleModel.judge_count) { // NSString *judgeQueryAddStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND question_type = 1 AND diff_degree IN (4,5) AND place_issue IS NULL %@ ORDER BY RANDOM() LIMIT %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, [NSString stringWithFormat:@"%ld",(long)(examRuleModel.judge_count - judgeChapterArr.count)]]; // NSArray *judgeChapterAddArr = [self queryQuestionWithQueryStr:judgeQueryAddStr]; // [judgeChapterArr addObjectsFromArray:judgeChapterAddArr]; // return judgeChapterArr.copy; // } else { // return judgeChapterArr.copy; // } // }].toArray.rac_sequence.signal subscribeNext:^(NSArray *judgeChapterArr) { // [judgeArr addObjectsFromArray:judgeChapterArr]; // } completed:^{ // [subscriber sendNext:judgeArr.copy]; // [subscriber sendCompleted]; // }]; // return [RACDisposable disposableWithBlock:^{}]; // }]; // // RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { // NSMutableArray *choiceArr = @[].mutableCopy; // [[[self getExamRuleWithCarType:carType subject:subject].rac_sequence.signal map:^id _Nullable(RQExamRuleModel *examRuleModel) { // NSString *chapterIdStr = [NSString stringWithFormat:@"AND chapter_id = %ld",(long)examRuleModel.chapter_id]; // NSString *choiceCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)examRuleModel.choice_count]; // NSString *choiceQueryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND question_type = 2 AND diff_degree IN (0,1,2,3) AND place_issue IS NULL %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, choiceCountStr]; // NSMutableArray *choiceChapterArr = [self queryQuestionWithQueryStr:choiceQueryStr].mutableCopy; // if (choiceChapterArr.count < examRuleModel.choice_count) { // NSString *choiceQueryAddStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND question_type = 2 AND diff_degree IN (4,5) AND place_issue IS NULL %@ ORDER BY RANDOM() LIMIT %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, [NSString stringWithFormat:@"%ld",(long)(examRuleModel.choice_count - choiceChapterArr.count)]]; // NSArray *choiceChapterAddArr = [self queryQuestionWithQueryStr:choiceQueryAddStr]; // [choiceChapterArr addObjectsFromArray:choiceChapterAddArr]; // return choiceChapterArr.copy; // } else { // return choiceChapterArr.copy; // } // }].toArray.rac_sequence.signal subscribeNext:^(NSArray *choiceChapterArr) { // [choiceArr addObjectsFromArray:choiceChapterArr]; // } completed:^{ // [subscriber sendNext:choiceArr.copy]; // [subscriber sendCompleted]; // }]; // return [RACDisposable disposableWithBlock:^{}]; // }]; // RACSignal *signal3 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { // NSMutableArray *multipleChoiceArr = @[].mutableCopy; // [[[self getExamRuleWithCarType:carType subject:subject].rac_sequence.signal map:^id _Nullable(RQExamRuleModel *examRuleModel) { // NSString *chapterIdStr = [NSString stringWithFormat:@"AND chapter_id = %ld",(long)examRuleModel.chapter_id]; // NSString *multipleChoiceCountStr = [NSString stringWithFormat:@"RANDOM() LIMIT %ld",(long)examRuleModel.multiple_choice_count]; // NSString *multipleChoiceQueryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND question_type = 3 AND diff_degree IN (0,1,2,3) AND place_issue IS NULL %@ ORDER BY %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, multipleChoiceCountStr]; // NSMutableArray *multipleChoiceChapterArr = [self queryQuestionWithQueryStr:multipleChoiceQueryStr].mutableCopy; // if (multipleChoiceChapterArr.count < examRuleModel.multiple_choice_count) { // NSString *multipleChoiceQueryAddStr = [NSString stringWithFormat:@"SELECT DISTINCT * FROM %@ WHERE %@ AND %@ AND question_type = 3 AND diff_degree IN (4,5) AND place_issue IS NULL %@ ORDER BY RANDOM() LIMIT %@",questionTableNameStr , queryCarTypeStr, querySubjectTypeStr, chapterIdStr, [NSString stringWithFormat:@"%ld",(long)(examRuleModel.multiple_choice_count - multipleChoiceChapterArr.count)]]; // NSArray *multipleChoiceChapterAddArr = [self queryQuestionWithQueryStr:multipleChoiceQueryAddStr]; // [multipleChoiceChapterArr addObjectsFromArray:multipleChoiceChapterAddArr]; // return multipleChoiceChapterArr.copy; // } else { // return multipleChoiceChapterArr.copy; // } // }].toArray.rac_sequence.signal subscribeNext:^(NSArray *multipleChoiceChapterArr) { // [multipleChoiceArr addObjectsFromArray:multipleChoiceChapterArr]; // } completed:^{ // [subscriber sendNext:multipleChoiceArr.copy]; // [subscriber sendCompleted]; // }]; // return [RACDisposable disposableWithBlock:^{}]; // }]; // return [[[RACSignal combineLatest:@[signal0] reduce:^id (NSArray *arr0){ // NSMutableArray *judgeArr = [NSMutableArray array]; // dispatch_semaphore_t sema = dispatch_semaphore_create(0); // [[arr0.rac_sequence.signal filter:^BOOL(RQExerciseModel *difficultQuestionModel) { // return ![judgeArr containsObject:difficultQuestionModel]; // }].toArray.rac_sequence.signal subscribeNext:^(RQExerciseModel *difficultQuestionModel) { // if (difficultQuestionModel.question_type == 1) { // NSMutableArray *sortChapterArr = [judgeArr.rac_sequence.signal filter:^BOOL(RQExerciseModel *judgeQuestionModel) { // return (judgeQuestionModel.chapter_id == difficultQuestionModel.chapter_id) && ![arr0 containsObject:judgeQuestionModel]; // }].toArray.mutableCopy; // if (sortChapterArr.count > 0) { // [judgeArr replaceObjectAtIndex:[judgeArr indexOfObject:sortChapterArr.lastObject] withObject:difficultQuestionModel]; // } // } //// else if (difficultQuestionModel.question_type == 2) { //// NSMutableArray *sortChapterArr = [choiceArr.rac_sequence.signal filter:^BOOL(RQExerciseModel *choiceQuestionModel) { //// return (choiceQuestionModel.chapter_id == difficultQuestionModel.chapter_id) && ![arr0 containsObject:choiceQuestionModel]; //// }].toArray.mutableCopy; //// if (sortChapterArr.count > 0) { //// [choiceArr replaceObjectAtIndex:[choiceArr indexOfObject:sortChapterArr.lastObject] withObject:difficultQuestionModel]; //// } //// } else { //// NSMutableArray *sortChapterArr = [multipleChoiceArr.rac_sequence.signal filter:^BOOL(RQExerciseModel *multiChoiceQuestionModel) { //// return (multiChoiceQuestionModel.chapter_id == difficultQuestionModel.chapter_id) && ![arr0 containsObject:multiChoiceQuestionModel]; //// }].toArray.mutableCopy; //// if (sortChapterArr.count > 0) { //// [multipleChoiceArr replaceObjectAtIndex:[multipleChoiceArr indexOfObject:sortChapterArr.lastObject] withObject:difficultQuestionModel]; //// } //// } // } completed:^{ // /// Key: 按照排序的key; ascending: YES为升序, NO为降序。 // NSSortDescriptor *strTppeSorter = [[NSSortDescriptor alloc] initWithKey:@"chapter_id" ascending:YES]; //// NSSortDescriptor *diff_degreeSorter = [NSSortDescriptor sortDescriptorWithKey:@"diff_degree" ascending:YES]; // NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:strTppeSorter, nil]; // // [arr addObjectsFromArray:[judgeArr sortedArrayUsingDescriptors:sortDescriptors]]; //// [arr addObjectsFromArray:[choiceArr sortedArrayUsingDescriptors:sortDescriptors]]; //// [arr addObjectsFromArray:[multipleChoiceArr sortedArrayUsingDescriptors:sortDescriptors]]; // dispatch_semaphore_signal(sema); // }]; // dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); // // return arr.copy; // }] map:^id _Nullable(NSArray *examArr) { // return examArr; // }].toArray firstObject]; // return arr.copy; } else if (pageType == RQHomeSubPageType_FreeTry) { queryStr = [NSString stringWithFormat:@"SELECT * FROM question_info INNER JOIN question_free ON question_info.id = question_free.id AND question_free.subject = '%@' ORDER BY %@", [RQ_COMMON_MANAGER getSubjectTypeNumStrWithSubjectType:subject],(exerciseType == RQExerciseType_Random)? @"random()" : @"question_free.free_sort + 0 ASC"]; return [self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]; } else if (pageType == RQHomeSubPageType_MockExamination && exerciseType == RQExerciseType_MiExam) { queryStr = [NSString stringWithFormat:@"SELECT * FROM (SELECT * FROM question_info AS a JOIN (SELECT id_ydt, MAX(id) AS id FROM question_info GROUP BY id_ydt) AS t ON a.id = t.id) AS q JOIN t_app_question_category AS c ON q.id_ydt = c.question_id AND c.kemu = %@ AND c.gs = '%@' AND c.category = %@ ORDER BY c.sort_order + 0 ASC", [RQ_COMMON_MANAGER getSubjectTypeNumStrWithSubjectType:subject],[RQ_COMMON_MANAGER getCarTypeSimpleCNStrWithCarType:carType],[RQ_COMMON_MANAGER getMiExamTypeNumStrWithMiExamType:RQ_COMMON_MANAGER.miExamType]]; return [self queryQuestionWithQueryStr:queryStr]; } else { return [self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]; } } - (RQExerciseModel *)getQuestionWithQuestionId:(NSInteger )questionId { __block RQExerciseModel *exerciseModel; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { exerciseModel = [self getQuestionWithDataBase:db questionId:questionId]; }]; } return exerciseModel; } - (void)getQuestionsWithQuestionIdArr:(NSArray *)questionIdArr complete:(VoidBlock_id)complete { NSMutableArray *arr = @[].mutableCopy; if (_databaseQueue) { [_databaseQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) { @try { [questionIdArr.rac_sequence.signal subscribeNext:^(NSString *questionIdStr) { RQExerciseModel *exerciseModel = [self getQuestionWithDataBase:db questionId:questionIdStr.integerValue]; [arr addObject:exerciseModel]; } completed:^{ if (complete) { complete(arr.copy); } }]; } @catch (NSException *exception) { *rollback = YES; } @finally { *rollback = NO; } }]; } } #pragma mark - Private Method - (NSArray *)queryQuestionWithQueryStr:(NSString *)queryStr exerciseType:(RQExerciseType)exerciseType { NSMutableArray *arr = @[].mutableCopy; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; resultSet = [db executeQuery:queryStr]; while ([resultSet next]) { RQExerciseModel *exerciseModel = [RQExerciseModel exerciseModelWithFMResultSet:resultSet]; if (exerciseType == RQExerciseType_Recitation) { exerciseModel.userAnswer = exerciseModel.answer; } [arr addObject:exerciseModel]; } }]; } return arr.copy; } - (NSArray *)queryQuestionWithQueryStr:(NSString *)queryStr { NSMutableArray *arr = @[].mutableCopy; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; resultSet = [db executeQuery:queryStr]; while ([resultSet next]) { RQExerciseModel *exerciseModel = [RQExerciseModel exerciseModelWithFMResultSet:resultSet]; [arr addObject:exerciseModel]; } }]; } return arr.copy; } - (NSString *)getQuestionNumQueryStrWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject questionType:(RQQuestionType)questionType isNew:(BOOL)isNew { switch (subject) { case RQHomePageSubjectType_SubjectOne: { switch (questionType) { case RQQuestionType_Judgment: { switch (carType) { case RQHomePageCarType_Car: return isNew? @"random() limit 20" : @"random() limit 20"; case RQHomePageCarType_Bus: return isNew? @"random() limit 20" : @"random() limit 20"; case RQHomePageCarType_Truck: return isNew? @"random() limit 20" : @"random() limit 20"; case RQHomePageCarType_Motorcycle: return isNew? @"random() limit 10" : @"random() limit 10"; default: return isNew? @"random() limit 20" : @"random() limit 20"; } } case RQQuestionType_SingleChoice: { switch (carType) { case RQHomePageCarType_Car: return isNew? @"random() limit 10" : @"random() limit 50"; case RQHomePageCarType_Bus: return isNew? @"random() limit 10" : @"random() limit 50"; case RQHomePageCarType_Truck: return isNew? @"random() limit 10" : @"random() limit 50"; case RQHomePageCarType_Motorcycle: return isNew? @"random() limit 5" : @"random() limit 25"; default: return isNew? @"random() limit 10" : @"random() limit 50"; } } case RQQuestionType_MultipleChoice: { switch (carType) { case RQHomePageCarType_Car: return @"random() limit 0"; case RQHomePageCarType_Bus: return @"random() limit 0"; case RQHomePageCarType_Truck: return @"random() limit 0"; case RQHomePageCarType_Motorcycle: return @"random() limit 0"; default: return @"random() limit 0"; } } } } case RQHomePageSubjectType_SubjectFour: { switch (questionType) { case RQQuestionType_Judgment: { switch (carType) { case RQHomePageCarType_Car: return @"random() limit 10"; case RQHomePageCarType_Bus: return @"random() limit 10"; case RQHomePageCarType_Truck: return @"random() limit 10"; case RQHomePageCarType_Motorcycle: return @"random() limit 10"; default: return @"random() limit 10"; } } case RQQuestionType_SingleChoice: { switch (carType) { case RQHomePageCarType_Car: return @"random() limit 10"; case RQHomePageCarType_Bus: return @"random() limit 10"; case RQHomePageCarType_Truck: return @"random() limit 10"; case RQHomePageCarType_Motorcycle: return @"random() limit 10"; default: return @"random() limit 10"; } } case RQQuestionType_MultipleChoice: { switch (carType) { case RQHomePageCarType_Car: return @"random() limit 5"; case RQHomePageCarType_Bus: return @"random() limit 5"; case RQHomePageCarType_Truck: return @"random() limit 5"; case RQHomePageCarType_Motorcycle: return @"random() limit 5"; default: return @"random() limit 5"; } } } } default: return @"random() limit 5"; } } - (RQExerciseModel *)getQuestionWithDataBase:(FMDatabase *)dataBase questionId:(NSInteger )questionId { RQExerciseModel *exerciseModel; FMResultSet *resultSet; resultSet = [dataBase executeQuery:[NSString stringWithFormat:@"select * from question_info where id = %ld or id_ydt = %ld", questionId, questionId]]; while ([resultSet next]) { exerciseModel = [RQExerciseModel exerciseModelWithFMResultSet:resultSet]; } return exerciseModel; } - (NSInteger)getQuestionVersion { __block NSInteger version = 0; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; resultSet = [db executeQuery:@"select version_num from question_version"]; while ([resultSet next]) { version = [resultSet longLongIntForColumn:@"version_num"]; } }]; } return version; } - (NSInteger)getQuestionVersionWithResourcePath:(NSString *)resourcePath { __block NSInteger version = 0; [[FMDatabaseQueue databaseQueueWithPath:resourcePath] inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; resultSet = [db executeQuery:@"SELECT version_num FROM question_version"]; while ([resultSet next]) { version = [resultSet longLongIntForColumn:@"version_num"]; } }]; return version; } - (NSArray *)getExamRuleWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject { NSString *queryCarTypeStr = [NSString stringWithFormat:@"gs LIKE '%%%@%%'",[RQ_COMMON_MANAGER getCarTypeSimpleCNStrWithCarType:carType]]; NSString *querySubjectTypeStr = [NSString stringWithFormat:@"kemu = '%@'",[RQ_COMMON_MANAGER getSubjectTypeNumStrWithSubjectType:subject]]; NSString *examRuleTableName = @"t_app_exam_rule"; NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE %@ AND %@ AND areacode = 0 ", examRuleTableName, queryCarTypeStr, querySubjectTypeStr]; return [self queryExamRuleWithQueryStr:queryStr]; } - (NSArray *)queryExamRuleWithQueryStr:(NSString *)queryStr { NSMutableArray *arr = @[].mutableCopy; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; resultSet = [db executeQuery:queryStr]; while ([resultSet next]) { RQExamRuleModel *examRuleModel = [RQExamRuleModel sdjkExamRuleModelWithFMResultSet:resultSet]; [arr addObject:examRuleModel]; } }]; } return arr.copy; } - (RQExplainModel *)getExplainWithExerciseModel:(RQExerciseModel *)exerciseModel { __block RQExplainModel *explainModel; if (_databaseQueue) { [_databaseQueue inDatabase:^(FMDatabase * _Nonnull db) { FMResultSet *resultSet; NSString *queryStr = [NSString stringWithFormat:@"SELECT * FROM %@ WHERE questionIds = %ld", @"question_sd_js", (long)exerciseModel.id_ydt]; resultSet = [db executeQuery:queryStr]; while ([resultSet next]) { explainModel = [RQExplainModel questionExplainWithFMResultSet:resultSet]; } }]; } return explainModel; } @end