RQQuestionDBManager.m 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450
  1. //
  2. // RQQuestionDBManager.m
  3. // SDJK
  4. //
  5. // Created by 张嵘 on 2021/8/20.
  6. //
  7. #import "RQQuestionDBManager.h"
  8. @interface RQQuestionDBManager ()
  9. //@property (nonatomic, readwrite, strong) FMDatabase *database;
  10. @property (nonatomic, readwrite, strong) FMDatabaseQueue *databaseQueue;
  11. @end
  12. @implementation RQQuestionDBManager
  13. static id rq_questionDBManager = nil;
  14. #pragma mark - init
  15. + (instancetype)sharedInstance {
  16. static dispatch_once_t onceToken;
  17. dispatch_once(&onceToken, ^{
  18. rq_questionDBManager = [[self alloc] init];
  19. });
  20. return rq_questionDBManager;
  21. }
  22. - (instancetype)init {
  23. if (self = [super init]) {
  24. NSError *error;
  25. NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"question20210722.db"]];
  26. NSString *resourcePath = [[NSBundle mainBundle] pathForResource:@"question20210722" ofType:@"db"];
  27. if ([RQFileManager isPathExist:dbPath]) {
  28. // self.database = [FMDatabase databaseWithPath:dbPath];
  29. self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
  30. NSLog(@"数据库path-----%@",dbPath);
  31. // [_database open];
  32. } else {
  33. [[RQFileManager fileManager] copyItemAtPath:resourcePath toPath:[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"question20210722.db"]] error:&error];
  34. // self.database = [FMDatabase databaseWithPath:dbPath];
  35. self.databaseQueue = [FMDatabaseQueue databaseQueueWithPath:dbPath];
  36. NSLog(@"数据库path-----%@",dbPath);
  37. // [_database open];
  38. }
  39. }
  40. return self;
  41. }
  42. #pragma mark - Public Method
  43. //- (NSArray *)getColumnWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject pageType:(RQHomeSubPageType)pageType {
  44. // NSMutableArray *arr = @[].mutableCopy;
  45. // /// 默认为轿车
  46. // NSString *queryCarTypeStr = @"lice_car = 1";
  47. //
  48. // switch (carType) {
  49. // case RQHomePageCarType_Car:
  50. // queryCarTypeStr = @"lice_car = 1";
  51. // break;
  52. // case RQHomePageCarType_Bus:
  53. // queryCarTypeStr = @"lice_bus = 1";
  54. // break;
  55. // case RQHomePageCarType_Truck:
  56. // queryCarTypeStr = @"lice_truck = 1";
  57. // break;
  58. // case RQHomePageCarType_Motorcycle:
  59. // queryCarTypeStr = @"lice_moto = 1";
  60. // break;
  61. //
  62. // default:
  63. // break;
  64. // }
  65. // /// 默认科目一
  66. // NSString *querySubjectTypeStr = @"subject_1 = 1";
  67. //
  68. // switch (subject) {
  69. // case RQHomePageSubjectType_SubjectOne:
  70. // querySubjectTypeStr = @"subject_1 = 1";
  71. // break;
  72. // case RQHomePageSubjectType_SubjectTwo:
  73. // querySubjectTypeStr = @"subject_2 = 1";
  74. // break;
  75. // case RQHomePageSubjectType_SubjectThree:
  76. // querySubjectTypeStr = @"subject_3 = 1";
  77. // break;
  78. // case RQHomePageSubjectType_SubjectFour:
  79. // querySubjectTypeStr = @"subject_4 = 1";
  80. // break;
  81. //
  82. // default:
  83. // break;
  84. // }
  85. //
  86. // /// 默认顺序练习
  87. // NSString *pageTypeStr = @"seque_issue_name";
  88. // NSString *pageTypeByOrderStr = @"seque_issue";
  89. //
  90. //
  91. // switch (pageType) {
  92. // case RQHomeSubPageType_SequentialPractice:
  93. // pageTypeStr = @"seque_issue_name";
  94. // pageTypeByOrderStr = @"seque_issue";
  95. // break;
  96. // case RQHomeSubPageType_LocalTopics:
  97. // pageTypeStr = @"place_issue_name";
  98. // pageTypeByOrderStr = @"place_issue";
  99. // break;
  100. // case RQHomeSubPageType_ClassificationExercise:
  101. // pageTypeStr = @"class_issue_name";
  102. // pageTypeByOrderStr = @"class_issue";
  103. // break;
  104. // case RQHomeSubPageType_SelectedTestQuestions:
  105. // pageTypeStr = @"excell_issue_name";
  106. // pageTypeByOrderStr = @"excell_issue";
  107. // break;
  108. //
  109. // default:
  110. // break;
  111. // }
  112. //
  113. // if ([_database open]) {
  114. // FMResultSet *resultSet;
  115. // 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];
  116. // resultSet = [_database executeQuery:queryStr];
  117. // while ([resultSet next]) {
  118. // NSString *str = [resultSet stringForColumn:pageTypeStr];
  119. // // 对应字段来取数据
  120. // [arr addObject:str? : @"地方题"];
  121. // }
  122. //
  123. // if ([arr containsObject:@"地方题"] && [arr indexOfObject:@"地方题"] == 0) {
  124. // NSString *saveStr = arr.firstObject;
  125. // [arr removeFirstObject];
  126. // [arr addObject:saveStr];
  127. // }
  128. //
  129. // [_database close];
  130. // }
  131. //
  132. // return arr.copy;
  133. //}
  134. //
  135. //- (NSArray *)getQuestionWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject pageType:(RQHomeSubPageType)pageType name:(NSString *)name exerciseType:(RQExerciseType)exerciseType {
  136. // NSMutableArray *arr = @[].mutableCopy;
  137. // /// 默认为轿车
  138. // NSString *queryCarTypeStr = @"lice_car = 1";
  139. //
  140. // switch (carType) {
  141. // case RQHomePageCarType_Car:
  142. // queryCarTypeStr = @"lice_car = 1";
  143. // break;
  144. // case RQHomePageCarType_Bus:
  145. // queryCarTypeStr = @"lice_bus = 1";
  146. // break;
  147. // case RQHomePageCarType_Truck:
  148. // queryCarTypeStr = @"lice_truck = 1";
  149. // break;
  150. // case RQHomePageCarType_Motorcycle:
  151. // queryCarTypeStr = @"lice_moto = 1";
  152. // break;
  153. //
  154. // default:
  155. // break;
  156. // }
  157. // /// 默认科目一
  158. // NSString *querySubjectTypeStr = @"subject_1 = 1";
  159. //
  160. // switch (subject) {
  161. // case RQHomePageSubjectType_SubjectOne:
  162. // querySubjectTypeStr = @"subject_1 = 1";
  163. // break;
  164. // case RQHomePageSubjectType_SubjectTwo:
  165. // querySubjectTypeStr = @"subject_2 = 1";
  166. // break;
  167. // case RQHomePageSubjectType_SubjectThree:
  168. // querySubjectTypeStr = @"subject_3 = 1";
  169. // break;
  170. // case RQHomePageSubjectType_SubjectFour:
  171. // querySubjectTypeStr = @"subject_4 = 1";
  172. // break;
  173. //
  174. // default:
  175. // break;
  176. // }
  177. //
  178. // /// 默认顺序练习
  179. // NSString *pageTypeStr = @"seque_issue_name";
  180. // NSString *pageTypeByOrderStr = @"seque_issue";
  181. // NSString *nameStr = @"";
  182. //
  183. // switch (pageType) {
  184. // case RQHomeSubPageType_SequentialPractice:
  185. // pageTypeStr = @"seque_issue_name";
  186. // pageTypeByOrderStr = @"seque_issue";
  187. // nameStr = [NSString stringWithFormat:@"and seque_issue_name = '%@'",name];
  188. // break;
  189. // case RQHomeSubPageType_LocalTopics:
  190. // pageTypeStr = @"place_issue_name";
  191. // pageTypeByOrderStr = @"place_issue";
  192. // nameStr = [NSString stringWithFormat:@"and place_issue_name = '%@'",name];
  193. // break;
  194. // case RQHomeSubPageType_ClassificationExercise:
  195. // pageTypeStr = @"class_issue_name";
  196. // pageTypeByOrderStr = @"class_issue";
  197. // nameStr = [NSString stringWithFormat:@"and class_issue_name = '%@'",name];
  198. // break;
  199. // case RQHomeSubPageType_SelectedTestQuestions:
  200. // pageTypeStr = @"excell_issue_name";
  201. // pageTypeByOrderStr = @"excell_issue";
  202. // nameStr = [NSString stringWithFormat:@"and excell_issue_name = '%@'",name];
  203. // break;
  204. //
  205. // default:
  206. // break;
  207. // }
  208. // if (RQStringIsEmpty(name)) {
  209. // nameStr = @"";
  210. // }
  211. //
  212. // /// 默认按_id排序
  213. // NSString *exerciseTypeStr = @"_id + 0 ASC";
  214. //
  215. // switch (exerciseType) {
  216. // case RQExerciseType_Sequential:
  217. // exerciseTypeStr = @"_id + 0 ASC";
  218. // break;
  219. // case RQExerciseType_Random:
  220. // exerciseTypeStr = @"random()";
  221. // break;
  222. // case RQExerciseType_Recitation:
  223. // exerciseTypeStr = @"_id + 0 ASC";
  224. // break;
  225. // case RQExerciseType_Test:
  226. // exerciseTypeStr = @"random() limit 50";
  227. // break;
  228. // case RQExerciseType_Exam:
  229. // exerciseTypeStr = @"random() limit 5";
  230. // break;
  231. //
  232. // default:
  233. // break;
  234. // }
  235. //
  236. // // resultSet = [_db executeQuery:@"select * from question_info where answer like '%-%'"];
  237. //
  238. // NSString *queryStr = [NSString stringWithFormat:@"select * from question_info where %@ and %@ %@ order by %@", queryCarTypeStr, querySubjectTypeStr, nameStr, exerciseTypeStr];
  239. //
  240. //
  241. // @weakify(queryStr)
  242. // if (exerciseType == RQExerciseType_Exam && pageType == RQHomeSubPageType_MockExamination) {
  243. //
  244. // RACSignal *signal1 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  245. // @strongify(queryStr)
  246. // 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]];
  247. // [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]];
  248. // [subscriber sendCompleted];
  249. // return [RACDisposable disposableWithBlock:^{
  250. // }];
  251. // }];
  252. //
  253. // RACSignal *signal2 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  254. // @strongify(queryStr)
  255. // 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]];
  256. // [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]];
  257. // [subscriber sendCompleted];
  258. // return [RACDisposable disposableWithBlock:^{
  259. // }];
  260. // }];
  261. // RACSignal *signal3 = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
  262. // @strongify(queryStr)
  263. // 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]];
  264. // [subscriber sendNext:[self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType]];
  265. // [subscriber sendCompleted];
  266. // return [RACDisposable disposableWithBlock:^{
  267. // }];
  268. // }];
  269. // RACSignal *signal4 = [RACSignal combineLatest:@[signal1, signal2, signal3] reduce:^id (NSArray *arr1, NSArray *arr2, NSArray *arr3){
  270. // [arr addObjectsFromArray:arr1];
  271. // [arr addObjectsFromArray:arr2];
  272. // [arr addObjectsFromArray:arr3];
  273. // return arr.copy;
  274. // }];
  275. // [signal4 subscribeNext:^(NSArray *allArr) {
  276. //
  277. // }];
  278. // return arr.copy;
  279. // } else {
  280. // return [self queryQuestionWithQueryStr:queryStr exerciseType:exerciseType];
  281. // }
  282. //}
  283. //
  284. //- (RQExerciseModel *)getQuestionWithQuestionId:(NSInteger )questionId {
  285. // RQExerciseModel *exerciseModel;
  286. // if ([_database open]) {
  287. // exerciseModel = [self getQuestionWithDataBase:_database questionId:questionId];
  288. // [_database close];
  289. // }
  290. // return exerciseModel;
  291. //}
  292. //
  293. //- (void)getQuestionsWithQuestionIdArr:(NSArray *)questionIdArr complete:(VoidBlock_id)complete {
  294. // NSMutableArray *arr = @[].mutableCopy;
  295. // if (_databaseQueue) {
  296. // [_databaseQueue inTransaction:^(FMDatabase * _Nonnull db, BOOL * _Nonnull rollback) {
  297. // @try {
  298. // [questionIdArr.rac_sequence.signal subscribeNext:^(NSString *questionIdStr) {
  299. // RQExerciseModel *exerciseModel = [self getQuestionWithDataBase:db questionId:questionIdStr.integerValue];
  300. // [arr addObject:exerciseModel];
  301. // } completed:^{
  302. // if (complete) {
  303. // complete(arr.copy);
  304. // }
  305. // }];
  306. // } @catch (NSException *exception) {
  307. // *rollback = YES;
  308. // } @finally {
  309. // *rollback = NO;
  310. // }
  311. // }];
  312. // }
  313. //}
  314. //
  315. //
  316. //#pragma mark - Private Method
  317. //- (NSArray *)queryQuestionWithQueryStr:(NSString *)queryStr exerciseType:(RQExerciseType)exerciseType {
  318. // NSMutableArray *arr = @[].mutableCopy;
  319. // if ([_database open]) {
  320. // FMResultSet *resultSet;
  321. // resultSet = [_database executeQuery:queryStr];
  322. // while ([resultSet next]) {
  323. // RQExerciseModel *exerciseModel = [RQExerciseModel exerciseModelWithFMResultSet:resultSet];
  324. // if (exerciseType == RQExerciseType_Recitation) {
  325. // exerciseModel.userAnswer = exerciseModel.answer;
  326. // }
  327. // [arr addObject:exerciseModel];
  328. // }
  329. //
  330. // [_database close];
  331. // }
  332. // return arr.copy;
  333. //}
  334. //
  335. //- (NSString *)getQuestionNumQueryStrWithCarType:(RQHomePageCarType)carType subject:(RQHomePageSubjectType)subject questionType:(RQQuestionType)questionType {
  336. // switch (subject) {
  337. // case RQHomePageSubjectType_SubjectOne: {
  338. // switch (questionType) {
  339. // case RQQuestionType_Judgment: {
  340. // switch (carType) {
  341. // case RQHomePageCarType_Car:
  342. // return @"random() limit 40";
  343. // case RQHomePageCarType_Bus:
  344. // return @"random() limit 40";
  345. // case RQHomePageCarType_Truck:
  346. // return @"random() limit 40";
  347. // case RQHomePageCarType_Motorcycle:
  348. // return @"random() limit 20";
  349. // default:
  350. // return @"random() limit 40";
  351. // }
  352. // }
  353. // case RQQuestionType_SingleChoice: {
  354. // switch (carType) {
  355. // case RQHomePageCarType_Car:
  356. // return @"random() limit 60";
  357. // case RQHomePageCarType_Bus:
  358. // return @"random() limit 60";
  359. // case RQHomePageCarType_Truck:
  360. // return @"random() limit 60";
  361. // case RQHomePageCarType_Motorcycle:
  362. // return @"random() limit 30";
  363. // default:
  364. // return @"random() limit 60";
  365. // }
  366. // }
  367. // case RQQuestionType_MultipleChoice: {
  368. // switch (carType) {
  369. // case RQHomePageCarType_Car:
  370. // return @"random() limit 0";
  371. // case RQHomePageCarType_Bus:
  372. // return @"random() limit 0";
  373. // case RQHomePageCarType_Truck:
  374. // return @"random() limit 0";
  375. // case RQHomePageCarType_Motorcycle:
  376. // return @"random() limit 0";
  377. // default:
  378. // return @"random() limit 0";
  379. // }
  380. // }
  381. // }
  382. // }
  383. // case RQHomePageSubjectType_SubjectFour: {
  384. // switch (questionType) {
  385. // case RQQuestionType_Judgment: {
  386. // switch (carType) {
  387. // case RQHomePageCarType_Car:
  388. // return @"random() limit 20";
  389. // case RQHomePageCarType_Bus:
  390. // return @"random() limit 20";
  391. // case RQHomePageCarType_Truck:
  392. // return @"random() limit 20";
  393. // case RQHomePageCarType_Motorcycle:
  394. // return @"random() limit 20";
  395. // default:
  396. // return @"random() limit 20";
  397. // }
  398. // }
  399. // case RQQuestionType_SingleChoice: {
  400. // switch (carType) {
  401. // case RQHomePageCarType_Car:
  402. // return @"random() limit 20";
  403. // case RQHomePageCarType_Bus:
  404. // return @"random() limit 20";
  405. // case RQHomePageCarType_Truck:
  406. // return @"random() limit 20";
  407. // case RQHomePageCarType_Motorcycle:
  408. // return @"random() limit 20";
  409. // default:
  410. // return @"random() limit 20";
  411. // }
  412. // }
  413. // case RQQuestionType_MultipleChoice: {
  414. // switch (carType) {
  415. // case RQHomePageCarType_Car:
  416. // return @"random() limit 10";
  417. // case RQHomePageCarType_Bus:
  418. // return @"random() limit 10";
  419. // case RQHomePageCarType_Truck:
  420. // return @"random() limit 10";
  421. // case RQHomePageCarType_Motorcycle:
  422. // return @"random() limit 10";
  423. // default:
  424. // return @"random() limit 10";
  425. // }
  426. // }
  427. // }
  428. // }
  429. // default:
  430. // return @"random() limit 5";
  431. // }
  432. //}
  433. //
  434. //- (RQExerciseModel *)getQuestionWithDataBase:(FMDatabase *)dataBase questionId:(NSInteger )questionId {
  435. // RQExerciseModel *exerciseModel;
  436. // FMResultSet *resultSet;
  437. // resultSet = [dataBase executeQuery:[NSString stringWithFormat:@"select * from question_info where _id = %ld", questionId]];
  438. // while ([resultSet next]) {
  439. // exerciseModel = [RQExerciseModel exerciseModelWithFMResultSet:resultSet];
  440. // }
  441. // return exerciseModel;
  442. //}
  443. @end