FLEXTableListViewController.m 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  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. #import "NSArray+Functional.h"
  14. @interface FLEXTableListViewController ()
  15. @property (nonatomic, readonly) id<FLEXDatabaseManager> dbm;
  16. @property (nonatomic, readonly) NSString *path;
  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. _path = [path copy];
  27. _dbm = [self databaseManagerForFileAtPath:self.path];
  28. [self.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 managerForDatabase:path];
  38. }
  39. NSArray<NSString *> *realmExtensions = [FLEXTableListViewController supportedRealmExtensions];
  40. if (realmExtensions != nil && [realmExtensions indexOfObject:pathExtension] != NSNotFound) {
  41. return [FLEXRealmDatabaseManager managerForDatabase:path];
  42. }
  43. return nil;
  44. }
  45. - (void)getAllTables {
  46. self.tables = self.filteredTables = [self.dbm queryAllTables];;
  47. }
  48. - (void)viewDidLoad {
  49. [super viewDidLoad];
  50. self.showsSearchBar = YES;
  51. }
  52. #pragma mark - Search bar
  53. - (void)updateSearchResults:(NSString *)searchText {
  54. if (searchText.length) {
  55. self.filteredTables = [self.tables flex_filtered:^BOOL(NSString *tableName, NSUInteger idx) {
  56. return [tableName containsString:searchText];
  57. }];
  58. } else {
  59. self.filteredTables = self.tables;
  60. }
  61. [self.tableView reloadData];
  62. }
  63. #pragma mark - Table View Data Source
  64. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  65. return self.filteredTables.count;
  66. }
  67. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  68. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"FLEXTableListViewControllerCell"];
  69. if (!cell) {
  70. cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
  71. reuseIdentifier:@"FLEXTableListViewControllerCell"];
  72. }
  73. cell.textLabel.text = self.filteredTables[indexPath.row];
  74. return cell;
  75. }
  76. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  77. FLEXTableContentViewController *contentViewController = [FLEXTableContentViewController new];
  78. contentViewController.rows = [self.dbm queryAllDataWithTableName:self.filteredTables[indexPath.row]];
  79. contentViewController.columns = [self.dbm queryAllColumnsWithTableName:self.filteredTables[indexPath.row]];
  80. contentViewController.title = self.filteredTables[indexPath.row];
  81. [self.navigationController pushViewController:contentViewController animated:YES];
  82. }
  83. - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
  84. return [NSString stringWithFormat:@"Tables (%lu)", (unsigned long)self.filteredTables.count];
  85. }
  86. #pragma mark - FLEXTableListViewController
  87. + (BOOL)supportsExtension:(NSString *)extension {
  88. extension = extension.lowercaseString;
  89. NSArray<NSString *> *sqliteExtensions = [FLEXTableListViewController supportedSQLiteExtensions];
  90. if (sqliteExtensions.count > 0 && [sqliteExtensions indexOfObject:extension] != NSNotFound) {
  91. return YES;
  92. }
  93. NSArray<NSString *> *realmExtensions = [FLEXTableListViewController supportedRealmExtensions];
  94. if (realmExtensions.count > 0 && [realmExtensions indexOfObject:extension] != NSNotFound) {
  95. return YES;
  96. }
  97. return NO;
  98. }
  99. + (NSArray<NSString *> *)supportedSQLiteExtensions {
  100. return @[@"db", @"sqlite", @"sqlite3"];
  101. }
  102. + (NSArray<NSString *> *)supportedRealmExtensions {
  103. if (NSClassFromString(@"RLMRealm") == nil) {
  104. return nil;
  105. }
  106. return @[@"realm"];
  107. }
  108. @end