// // RQQuestionDBManager.m // SDJK // // Created by 张嵘 on 2021/8/20. // #import "RQQuestionDBManager.h" @interface RQQuestionDBManager () //@property (nonatomic, readwrite, strong) FMDatabase *database; @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]) { NSError *error; NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"question20210722.db"]]; NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"question20210722" ofType:@"db"]; if ([RQFileManager isPathExist:dbPath]) { // self.database = [FMDatabase databaseWithPath:dbPath]; self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath]; NSLog(@"数据库path-----%@",dbPath); // [_database open]; } else { [[RQFileManager fileManager] copyItemAtPath:resourcePath toPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"question20210722.db"]] error:&error]; // self.database = [FMDatabase databaseWithPath:dbPath]; self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath]; NSLog(@"数据库path-----%@",dbPath); // [_database open]; } } return self; } #pragma mark - Public Method //- (NSArray *)getColumnWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject pageType:(RQHomeSubPageType)pageType { // NSMutableArray *arr = @[].mutableCopy; // /// 默认为轿车 // NSString *queryCarTypeStr = @"lice_car = 1"; // // switch (carType) { // case RQHomePageCarType_Car: // queryCarTypeStr = @"lice_car = 1"; // break; // case RQHomePageCarType_Bus: // queryCarTypeStr = @"lice_bus = 1"; // break; // case RQHomePageCarType_Truck: // queryCarTypeStr = @"lice_truck = 1"; // break; // case RQHomePageCarType_Motorcycle: // queryCarTypeStr = @"lice_moto = 1"; // break; // // default: // break; // } // /// 默认科目一 // NSString *querySubjectTypeStr = @"subject_1 = 1"; // // switch (subject) { // case RQHomePageSubjectType_SubjectOne: // querySubjectTypeStr = @"subject_1 = 1"; // break; // case RQHomePageSubjectType_SubjectTwo: // querySubjectTypeStr = @"subject_2 = 1"; // break; // case RQHomePageSubjectType_SubjectThree: // querySubjectTypeStr = @"subject_3 = 1"; // break; // case RQHomePageSubjectType_SubjectFour: // querySubjectTypeStr = @"subject_4 = 1"; // break; // // default: // break; // } // // /// 默认顺序练习 // NSString *pageTypeStr = @"seque_issue_name"; // NSString *pageTypeByOrderStr = @"seque_issue"; // // // switch (pageType) { // case RQHomeSubPageType_SequentialPractice: // pageTypeStr = @"seque_issue_name"; // pageTypeByOrderStr = @"seque_issue"; // break; // case RQHomeSubPageType_LocalTopics: // pageTypeStr = @"place_issue_name"; // pageTypeByOrderStr = @"place_issue"; // break; // case RQHomeSubPageType_ClassificationExercise: // pageTypeStr = @"class_issue_name"; // pageTypeByOrderStr = @"class_issue"; // break; // case RQHomeSubPageType_SelectedTestQuestions: // pageTypeStr = @"excell_issue_name"; // pageTypeByOrderStr = @"excell_issue"; // break; // // default: // break; // } // // if ([_database open]) { // FMResultSet *resultSet; // NSString *queryStr = [NSString stringWithFormat:@"select distinct %@ from question_info where %@ and %@ %@ order by %@ + 0 ASC", pageTypeStr, queryCarTypeStr, querySubjectTypeStr, (pageType == RQHomeSubPageType_LocalTopics)? @"and place_issue != 0" : @"", pageTypeByOrderStr]; // resultSet = [_database executeQuery:queryStr]; // while ([resultSet next]) { // NSString *str = [resultSet stringForColumn:pageTypeStr]; // // 对应字段来取数据 // [arr addObject:str? : @"地方题"]; // } // // if ([arr containsObject:@"地方题"] && [arr indexOfObject:@"地方题"] == 0) { // NSString *saveStr = arr.firstObject; // [arr removeFirstObject]; // [arr addObject:saveStr]; // } // // [_database close]; // } // // return arr.copy; //} // //- (NSArray *)getQuestionWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject pageType:(RQHomeSubPageType)pageType name:(NSString *)name exerciseType:(RQExerciseType)exerciseType { // NSMutableArray *arr = @[].mutableCopy; // /// 默认为轿车 // NSString *queryCarTypeStr = @"lice_car = 1"; // // switch (carType) { // case RQHomePageCarType_Car: // queryCarTypeStr = @"lice_car = 1"; // break; // case RQHomePageCarType_Bus: // queryCarTypeStr = @"lice_bus = 1"; // break; // case RQHomePageCarType_Truck: // queryCarTypeStr = @"lice_truck = 1"; // break; // case RQHomePageCarType_Motorcycle: // queryCarTypeStr = @"lice_moto = 1"; // break; // // default: // break; // } // /// 默认科目一 // NSString *querySubjectTypeStr = @"subject_1 = 1"; // // switch (subject) { // case RQHomePageSubjectType_SubjectOne: // querySubjectTypeStr = @"subject_1 = 1"; // break; // case RQHomePageSubjectType_SubjectTwo: // querySubjectTypeStr = @"subject_2 = 1"; // break; // case RQHomePageSubjectType_SubjectThree: // querySubjectTypeStr = @"subject_3 = 1"; // break; // case RQHomePageSubjectType_SubjectFour: // querySubjectTypeStr = @"subject_4 = 1"; // break; // // default: // break; // } // // /// 默认顺序练习 // NSString *pageTypeStr = @"seque_issue_name"; // NSString *pageTypeByOrderStr = @"seque_issue"; // NSString *nameStr = @""; // // switch (pageType) { // case RQHomeSubPageType_SequentialPractice: // pageTypeStr = @"seque_issue_name"; // pageTypeByOrderStr = @"seque_issue"; // nameStr = [NSString stringWithFormat:@"and seque_issue_name = '%@'",name]; // break; // case RQHomeSubPageType_LocalTopics: // pageTypeStr = @"place_issue_name"; // pageTypeByOrderStr = @"place_issue"; // nameStr = [NSString stringWithFormat:@"and place_issue_name = '%@'",name]; // break; // case RQHomeSubPageType_ClassificationExercise: // pageTypeStr = @"class_issue_name"; // pageTypeByOrderStr = @"class_issue"; // nameStr = [NSString stringWithFormat:@"and class_issue_name = '%@'",name]; // break; // case RQHomeSubPageType_SelectedTestQuestions: // pageTypeStr = @"excell_issue_name"; // pageTypeByOrderStr = @"excell_issue"; // nameStr = [NSString stringWithFormat:@"and excell_issue_name = '%@'",name]; // break; // // default: // break; // } // if (RQStringIsEmpty(name)) { // nameStr = @""; // } // // /// 默认按_id排序 // NSString *exerciseTypeStr = @"_id + 0 ASC"; // // switch (exerciseType) { // case RQExerciseType_Sequential: // exerciseTypeStr = @"_id + 0 ASC"; // break; // case RQExerciseType_Random: // exerciseTypeStr = @"random()"; // break; // case RQExerciseType_Recitation: // exerciseTypeStr = @"_id + 0 ASC"; // 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, querySubjectTypeStr, nameStr, exerciseTypeStr]; // // // @weakify(queryStr) // if (exerciseType == RQExerciseType_Exam && pageType == RQHomeSubPageType_MockExamination) { // // RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id _Nonnull subscriber) { // @strongify(queryStr) // queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, @"and answer like '%√%' or answer like '%×%'", [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_Judgment]]; // [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 %@ %@ %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, @"and answer not like '%√%' and answer not like '%×%' and answer not like '%-%'", [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_SingleChoice]]; // [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 %@ %@ %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, @"and answer like '%-%' ", [self getQuestionNumQueryStrWithCarType:carType subject:subject questionType:RQQuestionType_MultipleChoice]]; // [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]]; // [subscriber sendCompleted]; // return [RACDisposable disposableWithBlock:^{ // }]; // }]; // RACSignal *signal4 = [RACSignal combineLatest:@[signal1, signal2, signal3] reduce:^id (NSArray *arr1, NSArray *arr2, NSArray *arr3){ // [arr addObjectsFromArray:arr1]; // [arr addObjectsFromArray:arr2]; // [arr addObjectsFromArray:arr3]; // return arr.copy; // }]; // [signal4 subscribeNext:^(NSArray *allArr) { // // }]; // return arr.copy; // } else { // return [self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]; // } //} // //- (RQExerciseModel *)getQuestionWithQuestionId:(NSInteger )questionId { // RQExerciseModel *exerciseModel; // if ([_database open]) { // exerciseModel = [self getQuestionWithDataBase:_database questionId:questionId]; // [_database close]; // } // 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 ([_database open]) { // FMResultSet *resultSet; // resultSet = [_database executeQuery:queryStr]; // while ([resultSet next]) { // RQExerciseModel *exerciseModel = [RQExerciseModel exerciseModelWithFMResultSet:resultSet]; // if (exerciseType == RQExerciseType_Recitation) { // exerciseModel.userAnswer = exerciseModel.answer; // } // [arr addObject:exerciseModel]; // } // // [_database close]; // } // return arr.copy; //} // //- (NSString *)getQuestionNumQueryStrWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject questionType:(RQQuestionType)questionType { // switch (subject) { // case RQHomePageSubjectType_SubjectOne: { // switch (questionType) { // case RQQuestionType_Judgment: { // switch (carType) { // case RQHomePageCarType_Car: // return @"random() limit 40"; // case RQHomePageCarType_Bus: // return @"random() limit 40"; // case RQHomePageCarType_Truck: // return @"random() limit 40"; // case RQHomePageCarType_Motorcycle: // return @"random() limit 20"; // default: // return @"random() limit 40"; // } // } // case RQQuestionType_SingleChoice: { // switch (carType) { // case RQHomePageCarType_Car: // return @"random() limit 60"; // case RQHomePageCarType_Bus: // return @"random() limit 60"; // case RQHomePageCarType_Truck: // return @"random() limit 60"; // case RQHomePageCarType_Motorcycle: // return @"random() limit 30"; // default: // return @"random() limit 60"; // } // } // 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 20"; // case RQHomePageCarType_Bus: // return @"random() limit 20"; // case RQHomePageCarType_Truck: // return @"random() limit 20"; // case RQHomePageCarType_Motorcycle: // return @"random() limit 20"; // default: // return @"random() limit 20"; // } // } // case RQQuestionType_SingleChoice: { // switch (carType) { // case RQHomePageCarType_Car: // return @"random() limit 20"; // case RQHomePageCarType_Bus: // return @"random() limit 20"; // case RQHomePageCarType_Truck: // return @"random() limit 20"; // case RQHomePageCarType_Motorcycle: // return @"random() limit 20"; // default: // return @"random() limit 20"; // } // } // case RQQuestionType_MultipleChoice: { // 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"; // } // } // } // } // 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", questionId]]; // while ([resultSet next]) { // exerciseModel = [RQExerciseModel exerciseModelWithFMResultSet:resultSet]; // } // return exerciseModel; //} @end