FLEXTableListViewController.m 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. //
  2. // PTTableListViewController.m
  3. // PTDatabaseReader
  4. //
  5. // Created by Peng Tao on 15/11/23.
  6. // Copyright © 2015年 Peng Tao. All rights reserved.
  7. //
  8. #import "FLEXTableListViewController.h"
  9. #import "FLEXDatabaseManager.h"
  10. #import "FLEXSQLiteDatabaseManager.h"
  11. #import "FLEXRealmDatabaseManager.h"
  12. #import "FLEXTableContentViewController.h"
  13. @interface FLEXTableListViewController () {
  14. id<FLEXDatabaseManager> _dbm;
  15. NSString *_databasePath;
  16. }
  17. @property (nonatomic) NSArray<NSString *> *tables;
  18. @property (nonatomic) NSArray<NSString *> *filteredTables;
  19. + (NSArray<NSString *> *)supportedSQLiteExtensions;
  20. + (NSArray<NSString *> *)supportedRealmExtensions;
  21. @end
  22. @implementation FLEXTableListViewController
  23. - (instancetype)initWithPath:(NSString *)path {
  24. self = [super initWithStyle:UITableViewStyleGrouped];
  25. if (self) {
  26. _databasePath = [path copy];
  27. _dbm = [self databaseManagerForFileAtPath:_databasePath];
  28. [_dbm open];
  29. [self getAllTables];
  30. }
  31. return self;
  32. }
  33. - (id<FLEXDatabaseManager>)databaseManagerForFileAtPath:(NSString *)path {
  34. NSString *pathExtension = path.pathExtension.lowercaseString;
  35. NSArray<NSString *> *sqliteExtensions = [FLEXTableListViewController supportedSQLiteExtensions];
  36. if ([sqliteExtensions indexOfObject:pathExtension] != NSNotFound) {
  37. return [[FLEXSQLiteDatabaseManager alloc] initWithPath:path];
  38. }
  39. NSArray<NSString *> *realmExtensions = [FLEXTableListViewController supportedRealmExtensions];
  40. if (realmExtensions != nil && [realmExtensions indexOfObject:pathExtension] != NSNotFound) {
  41. return [[FLEXRealmDatabaseManager alloc] initWithPath:path];
  42. }
  43. return nil;
  44. }
  45. - (void)getAllTables {
  46. NSArray<NSDictionary<NSString *, id> *> *resultArray = [_dbm queryAllTables];
  47. NSMutableArray<NSString *> *array = [NSMutableArray array];
  48. for (NSDictionary<NSString *, id> *dict in resultArray) {
  49. NSString *columnName = (NSString *)dict[@"name"] ?: @"";
  50. [array addObject:columnName];
  51. }
  52. self.tables = array;
  53. self.filteredTables = array;
  54. }
  55. - (void)viewDidLoad {
  56. [super viewDidLoad];
  57. self.showsSearchBar = YES;
  58. }
  59. #pragma mark - Search bar
  60. - (void)updateSearchResults:(NSString *)searchText {
  61. if (searchText.length > 0) {
  62. NSPredicate *searchPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", searchText];
  63. self.filteredTables = [self.tables filteredArrayUsingPredicate:searchPredicate];
  64. } else {
  65. self.filteredTables = self.tables;
  66. }
  67. [self.tableView reloadData];
  68. }
  69. #pragma mark - Table View Data Source
  70. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  71. return self.filteredTables.count;
  72. }
  73. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  74. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FLEXTableListViewControllerCell"];
  75. if (!cell) {
  76. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
  77. reuseIdentifier:@"FLEXTableListViewControllerCell"];
  78. }
  79. cell.textLabel.text = self.filteredTables[indexPath.row];
  80. return cell;
  81. }
  82. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  83. FLEXTableContentViewController *contentViewController = [FLEXTableContentViewController new];
  84. contentViewController.contentsArray = [_dbm queryAllDataWithTableName:self.filteredTables[indexPath.row]];
  85. contentViewController.columnsArray = [_dbm queryAllColumnsWithTableName:self.filteredTables[indexPath.row]];
  86. contentViewController.title = self.filteredTables[indexPath.row];
  87. [self.navigationController pushViewController:contentViewController animated:YES];
  88. }
  89. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
  90. return [NSString stringWithFormat:@"Tables (%lu)", (unsigned long)self.filteredTables.count];
  91. }
  92. #pragma mark - FLEXTableListViewController
  93. + (BOOL)supportsExtension:(NSString *)extension {
  94. extension = extension.lowercaseString;
  95. NSArray<NSString *> *sqliteExtensions = [FLEXTableListViewController supportedSQLiteExtensions];
  96. if (sqliteExtensions.count > 0 && [sqliteExtensions indexOfObject:extension] != NSNotFound) {
  97. return YES;
  98. }
  99. NSArray<NSString *> *realmExtensions = [FLEXTableListViewController supportedRealmExtensions];
  100. if (realmExtensions.count > 0 && [realmExtensions indexOfObject:extension] != NSNotFound) {
  101. return YES;
  102. }
  103. return NO;
  104. }
  105. + (NSArray<NSString *> *)supportedSQLiteExtensions {
  106. return @[@"db", @"sqlite", @"sqlite3"];
  107. }
  108. + (NSArray<NSString *> *)supportedRealmExtensions {
  109. if (NSClassFromString(@"RLMRealm") == nil) {
  110. return nil;
  111. }
  112. return @[@"realm"];
  113. }
  114. @end