You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

163 lines
4.8 KiB

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